home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / samba / patches / samba-1.010 / samba-1
Text File  |  1996-06-06  |  79KB  |  2,740 lines

  1. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/docs/BROWSING.txt samba-1.9.16alpha8/docs/BROWSING.txt
  2. --- samba-1.9.16alpha7/docs/BROWSING.txt    Sat May  4 17:50:22 1996
  3. +++ samba-1.9.16alpha8/docs/BROWSING.txt    Thu Jun  6 21:57:15 1996
  4. @@ -30,7 +30,7 @@
  5.  #
  6.  # first put ourselves in workgroup MYGROUP using
  7.  # our own net address
  8. -0.0.0.0 MYGROUP G
  9. +0.0.0.0 MYGROUP 255.255.255.0 G
  10.  
  11.  Note in the above that I overrode what workgroup Samba is in using the
  12.  G flag. Also note that the 0.0.0.0 address is used, which will be
  13. @@ -48,7 +48,7 @@
  14.  do the trick:
  15.  
  16.  # put ourselves in the STAFF workgroup on the other subnet
  17. -192.0.3.255 STAFF G
  18. +192.0.3.255 STAFF 255.255.255.0 G
  19.  
  20.  Notice the G at the end! It is very important you include this as this
  21.  entry without the G could cause a broadcast storm! 
  22. @@ -141,5 +141,13 @@
  23.  the -B option. This only works if your network setup listens on both
  24.  0s and 1s based broadcasts. The -B option can only control what
  25.  address it sends to, not what it listens on.
  26. +
  27. +MULTIPLE INTERFACES
  28. +===================
  29. +
  30. +Samba now supports machines with multiple network interfaces. If you
  31. +have multiple interfaces then you will need to use the "interfaces"
  32. +option in smb.conf to configure them. See smb.conf(5) for details.
  33. +
  34.  
  35.  
  36. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/docs/INSTALL.txt samba-1.9.16alpha8/docs/INSTALL.txt
  37. --- samba-1.9.16alpha7/docs/INSTALL.txt    Sat May  4 17:50:22 1996
  38. +++ samba-1.9.16alpha8/docs/INSTALL.txt    Thu Jun  6 21:57:15 1996
  39. @@ -113,11 +113,12 @@
  40.  underscore) in /etc/services. You must either edit /etc/services or
  41.  /etc/inetd.conf to make them consistant.
  42.  
  43. -NOTE: On many systems you may need to give the nmbd a -B parameter to
  44. -specify the broadcast address of your interface. Run ifconfig as root
  45. -if you don't know what the broadcast is for your net. nmbd tries to
  46. -determine it at run time, but fails on some unixes. See the section on
  47. -"testing nmbd" for a method of finding if you need to do this.
  48. +NOTE: On many systems you may need to use the "interfaces" option in
  49. +smb.conf to specify the IP address and netmask of your interfaces. Run
  50. +ifconfig as root if you don't know what the broadcast is for your
  51. +net. nmbd tries to determine it at run time, but fails on some
  52. +unixes. See the section on "testing nmbd" for a method of finding if
  53. +you need to do this.
  54.  
  55.  !!!WARNING!!! Many unixes only accept around 5 parameters on the
  56.  command line in inetd. This means you shouldn't use spaces between the
  57. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/docs/smb.conf.5 samba-1.9.16alpha8/docs/smb.conf.5
  58. --- samba-1.9.16alpha7/docs/smb.conf.5    Wed Jun  5 01:16:21 1996
  59. +++ samba-1.9.16alpha8/docs/smb.conf.5    Thu Jun  6 21:57:16 1996
  60. @@ -1048,6 +1048,31 @@
  61.  .B Example
  62.      hosts equiv = /etc/hosts.equiv
  63.  
  64. +.SS interfaces (G)
  65. +
  66. +This option allows you to setup multiple network interfaces, so that
  67. +Samba can properly handle browsing on all interfaces.
  68. +
  69. +The option takes a list of ip/netmask pairs. The netmask may either be
  70. +a bitmask, or a bitlength. 
  71. +
  72. +For example, the following line:
  73. +
  74. +interfaces = 192.168.2.10/24 192.168.3.10/24
  75. +
  76. +would configure two network interfaces with IP addresses 192.168.2.10
  77. +and 192.168.3.10. The netmasks of both interfaces would be set to
  78. +255.255.255.0. 
  79. +
  80. +You could produce an equivalent result by using:
  81. +
  82. +interfaces = 192.168.2.10/255.255.255.0 192.168.3.10/255.255.255.0
  83. +
  84. +if you prefer that format.
  85. +
  86. +If this option is not set then Samba will attempt to find a primary
  87. +interface, but won't attempt to configure more than one interface.
  88. +
  89.  .SS invalid users (S)
  90.  This is a list of users that should not be allowed to login to this
  91.  service. This is really a "paranoid" check to absolutely ensure an
  92. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/Makefile samba-1.9.16alpha8/source/Makefile
  93. --- samba-1.9.16alpha7/source/Makefile    Thu Jun  6 01:44:16 1996
  94. +++ samba-1.9.16alpha8/source/Makefile    Thu Jun  6 21:57:20 1996
  95. @@ -496,7 +496,8 @@
  96.  INCLUDES = $(INCLUDES1) $(INCLUDES2)
  97.  
  98.  UTILOBJ1 = util.o system.o charset.o kanji.o fault.o smbencrypt.o charcnv.o
  99. -UTILOBJ = $(UTILOBJ1) md4.o loadparm.o params.o pcap.o username.o time.o
  100. +UTILOBJ2 = $(UTILOBJ1) md4.o loadparm.o params.o pcap.o username.o time.o
  101. +UTILOBJ = $(UTILOBJ2) interface.o
  102.  PARAMOBJ = $(UTILOBJ) ufc.o smbpass.o access.o 
  103.  SMBDOBJ1 = $(PARAMOBJ) trans2.o message.o dir.o printing.o locking.o
  104.  SMBDOBJ2 = ipc.o reply.o mangle.o chgpasswd.o password.o quotas.o uid.o
  105. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/client.c samba-1.9.16alpha8/source/client.c
  106. --- samba-1.9.16alpha7/source/client.c    Wed Jun  5 01:16:26 1996
  107. +++ samba-1.9.16alpha8/source/client.c    Thu Jun  6 21:57:20 1996
  108. @@ -41,9 +41,7 @@
  109.  BOOL got_pass = False;
  110.  BOOL connect_as_printer = False;
  111.  BOOL connect_as_ipc = False;
  112. -extern struct in_addr bcast_ip;
  113. -static BOOL got_bcast=False;
  114. -struct in_addr ipzero;
  115. +extern struct in_addr ipzero;
  116.  
  117.  char cryptkey[8];
  118.  BOOL doencrypt=False;
  119. @@ -65,8 +63,6 @@
  120.  time_t newer_than = 0;
  121.  int archive_level = 0;
  122.  
  123. -extern struct in_addr myip;
  124. -
  125.  extern pstring debugf;
  126.  extern int DEBUGLEVEL;
  127.  
  128. @@ -3845,14 +3841,14 @@
  129.        strcpy(desthost,host);
  130.      }
  131.  
  132. -  DEBUG(3,("Opening sockets\n"));
  133. -
  134.    if (*myname == 0)
  135.      {
  136.        get_myname(myname,NULL);
  137.        strupper(myname);
  138.      }
  139.  
  140. +  DEBUG(3,("Opening sockets\n"));
  141. +
  142.    if (!have_ip)
  143.      {
  144.        struct hostent *hp;
  145. @@ -3864,17 +3860,12 @@
  146.  #ifdef USENMB
  147.      /* Try and resolve the name with the netbios server */
  148.      int               bcast;
  149. -    pstring        hs;
  150. -    struct in_addr    ip1, ip2;
  151. -    
  152. -    if ((bcast = open_socket_in(SOCK_DGRAM, 0, 3)) != -1) {
  153. -      set_socket_options (bcast, "SO_BROADCAST");
  154.  
  155. -      if (!got_bcast && get_myname(hs, &ip1)) {
  156. -        get_broadcast(&ip1, &bcast_ip, &ip2);
  157. -      }
  158. +    if ((bcast = open_socket_in(SOCK_DGRAM, 0, 3)) != -1) {
  159. +      set_socket_options(bcast, "SO_BROADCAST");
  160.  
  161. -      if (name_query(bcast, host, 0x20, True, True, bcast_ip, &dest_ip,0)){
  162. +      if (name_query(bcast, host, 0x20, True, True, *iface_bcast(dest_ip),
  163. +             &dest_ip,0)) {
  164.          failed = False;
  165.        }
  166.        close (bcast);
  167. @@ -4181,8 +4172,6 @@
  168.    TimeInit();
  169.    charset_initialise();
  170.  
  171. -  ipzero = *interpret_addr2("0.0.0.0");
  172. -
  173.    pid = getpid();
  174.    uid = getuid();
  175.    gid = getgid();
  176. @@ -4261,8 +4250,7 @@
  177.      message = True;
  178.      break;
  179.        case 'B':
  180. -    bcast_ip = *interpret_addr2(optarg);
  181. -    got_bcast = True;
  182. +    iface_set_default(NULL,optarg,NULL);
  183.      break;
  184.        case 'D':
  185.      strcpy(base_directory,optarg);
  186. @@ -4359,7 +4347,8 @@
  187.  
  188.    DEBUG(3,("%s client started (version %s)\n",timestring(),VERSION));
  189.  
  190. -  get_myname(*myname?NULL:myname,&myip);  
  191. +  load_interfaces();
  192. +  get_myname(*myname?NULL:myname,NULL);  
  193.    strupper(myname);
  194.  
  195.    if (tar_type) {
  196. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/cvs.log samba-1.9.16alpha8/source/cvs.log
  197. --- samba-1.9.16alpha7/source/cvs.log    Thu Jun  6 10:30:35 1996
  198. +++ samba-1.9.16alpha8/source/cvs.log    Thu Jun  6 21:58:16 1996
  199. @@ -1233,3 +1233,61 @@
  200.  Log Message:
  201.  preparing for release of 1.9.16alpha7
  202.  
  203. +
  204. +****************************************
  205. +Date:    Thursday June 6, 1996 @ 21:24
  206. +Author:    tridge
  207. +
  208. +Update of /data/cvs/samba/docs
  209. +In directory arvidsjaur:/var/tmp/cvs-serv25092
  210. +
  211. +Modified Files:
  212. +    BROWSING.txt INSTALL.txt smb.conf.5 
  213. +Log Message:
  214. +added some notes on the new "interfaces" option
  215. +
  216. +
  217. +
  218. +****************************************
  219. +Date:    Thursday June 6, 1996 @ 21:42
  220. +Author:    tridge
  221. +
  222. +Update of /data/cvs/samba/source
  223. +In directory arvidsjaur:/var/tmp/cvs-serv25750
  224. +
  225. +Modified Files:
  226. +    Makefile client.c includes.h ipc.c loadparm.c loadparm.h 
  227. +    localnet.h nameannounce.c namedb.c nameelect.c nameresp.c 
  228. +    nameserv.c namework.c nmbd.c nmblib.c nmblookup.c nmbsync.c 
  229. +    password.c proto.h server.c time.c util.c 
  230. +Added Files:
  231. +    interface.c 
  232. +Log Message:
  233. +- added interface.c and removed all the references to myip, bcast_ip
  234. +and Netmask, instead replacing them with calls to routines in
  235. +interface.c
  236. +
  237. +- got rid of old MAXINT define
  238. +
  239. +- added code to ensure we only return one entry for each name in the ipc
  240. +enum routines
  241. +
  242. +- added new_only option to add_netbios_entry() to prevent overwriting
  243. +of important names
  244. +
  245. +- minor time handling fixup
  246. +
  247. +
  248. +
  249. +****************************************
  250. +Date:    Thursday June 6, 1996 @ 21:57
  251. +Author:    samba-bu
  252. +
  253. +Update of /data/cvs/samba/source
  254. +In directory arvidsjaur:/samba/samba-bugs/samba/source
  255. +
  256. +Modified Files:
  257. +    version.h 
  258. +Log Message:
  259. +preparing for release of 1.9.16alpha8
  260. +
  261. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/includes.h samba-1.9.16alpha8/source/includes.h
  262. --- samba-1.9.16alpha7/source/includes.h    Thu Jun  6 01:44:17 1996
  263. +++ samba-1.9.16alpha8/source/includes.h    Thu Jun  6 21:57:20 1996
  264. @@ -899,10 +899,6 @@
  265.  #define FD_SETSIZE 255
  266.  #endif
  267.  
  268. -#ifndef MAXINT
  269. -#define MAXINT ((((unsigned)1)<<(sizeof(int)*8-1))-1)
  270. -#endif
  271. -
  272.  #ifndef __STDC__
  273.  #define const
  274.  #endif
  275. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/interface.c samba-1.9.16alpha8/source/interface.c
  276. --- samba-1.9.16alpha7/source/interface.c    Thu Jan  1 10:00:00 1970
  277. +++ samba-1.9.16alpha8/source/interface.c    Thu Jun  6 21:42:41 1996
  278. @@ -0,0 +1,421 @@
  279. +/* 
  280. +   Unix SMB/Netbios implementation.
  281. +   Version 1.9.
  282. +   multiple interface handling
  283. +   Copyright (C) Andrew Tridgell 1992-1995
  284. +   
  285. +   This program is free software; you can redistribute it and/or modify
  286. +   it under the terms of the GNU General Public License as published by
  287. +   the Free Software Foundation; either version 2 of the License, or
  288. +   (at your option) any later version.
  289. +   
  290. +   This program is distributed in the hope that it will be useful,
  291. +   but WITHOUT ANY WARRANTY; without even the implied warranty of
  292. +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  293. +   GNU General Public License for more details.
  294. +   
  295. +   You should have received a copy of the GNU General Public License
  296. +   along with this program; if not, write to the Free Software
  297. +   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  298. +*/
  299. +
  300. +#include "includes.h"
  301. +#include "loadparm.h"
  302. +
  303. +extern int DEBUGLEVEL;
  304. +
  305. +struct in_addr ipzero;
  306. +static struct in_addr default_ip;
  307. +static struct in_addr default_bcast;
  308. +static struct in_addr default_nmask;
  309. +static BOOL got_ip=False;
  310. +static BOOL got_bcast=False;
  311. +static BOOL got_nmask=False;
  312. +
  313. +static struct interface {
  314. +  struct interface *next;
  315. +  struct in_addr ip;
  316. +  struct in_addr bcast;
  317. +  struct in_addr nmask;
  318. +} *interfaces = NULL;
  319. +struct interface *last_iface;
  320. +
  321. +/****************************************************************************
  322. +calculate the default netmask for an address
  323. +****************************************************************************/
  324. +static void default_netmask(struct in_addr *inm, struct in_addr *iad)
  325. +{
  326. +  unsigned long ad = ntohl(iad->s_addr);
  327. +  unsigned long nm;
  328. +  /*
  329. +  ** Guess a netmask based on the class of the IP address given.
  330. +  */
  331. +  if ( (ad & 0x80000000) == 0 ) {
  332. +    /* class A address */
  333. +    nm = 0xFF000000;
  334. +  } else if ( (ad & 0xC0000000) == 0x80000000 ) {
  335. +    /* class B address */
  336. +    nm = 0xFFFF0000;
  337. +  } else if ( (ad & 0xE0000000) == 0xC0000000 ) {
  338. +    /* class C address */
  339. +    nm = 0xFFFFFF00;
  340. +  }  else {
  341. +    /* class D or E; netmask doesn't make much sense - guess 4 bits */
  342. +    nm =  0xFFFFFFF0;
  343. +  }
  344. +  inm->s_addr = htonl(nm);
  345. +}
  346. +
  347. +
  348. +/****************************************************************************
  349. +  get the broadcast address for our address 
  350. +(troyer@saifr00.ateng.az.honeywell.com)
  351. +****************************************************************************/
  352. +static void get_broadcast(struct in_addr *if_ipaddr,
  353. +              struct in_addr *if_bcast,
  354. +              struct in_addr *if_nmask)
  355. +{  
  356. +  BOOL found = False;
  357. +#ifndef NO_GET_BROADCAST
  358. +  int sock = -1;               /* AF_INET raw socket desc */
  359. +  char buff[1024];
  360. +  struct ifreq *ifr=NULL;
  361. +  int i;
  362. +
  363. +#if defined(EVEREST)
  364. +  int n_interfaces;
  365. +  struct ifconf ifc;
  366. +  struct ifreq  *ifreqs;
  367. +#elif defined(USE_IFREQ)
  368. +  struct ifreq ifreq;
  369. +  struct strioctl strioctl;
  370. +  struct ifconf *ifc;
  371. +#else
  372. +  struct ifconf ifc;
  373. +#endif
  374. +#endif
  375. +
  376. +  /* get a default netmask and broadcast */
  377. +  default_netmask(if_nmask, if_ipaddr);
  378. +
  379. +#ifndef NO_GET_BROADCAST  
  380. +  /* Create a socket to the INET kernel. */
  381. +#if USE_SOCKRAW
  382. +  if ((sock = socket(AF_INET, SOCK_RAW, PF_INET )) < 0)
  383. +#else
  384. +    if ((sock = socket(AF_INET, SOCK_DGRAM, 0 )) < 0)
  385. +#endif
  386. +      {
  387. +        DEBUG(0,( "Unable to open socket to get broadcast address\n"));
  388. +        return;
  389. +      }
  390. +  
  391. +  /* Get a list of the configured interfaces */
  392. +#ifdef EVEREST
  393. +  /* This is part of SCO Openserver 5: The ioctls are no longer part
  394. +     if the lower level STREAMS interface glue. They are now real
  395. +     ioctl calls */
  396. +
  397. +  if (ioctl(sock, SIOCGIFANUM, &n_interfaces) < 0) {
  398. +    DEBUG(0,( "SIOCGIFANUM: %s\n", strerror(errno)));
  399. +  } else {
  400. +    DEBUG(0,( "number of interfaces returned is: %d\n", n_interfaces));
  401. +
  402. +    ifc.ifc_len = sizeof(struct ifreq) * n_interfaces;
  403. +    ifc.ifc_buf = (caddr_t) alloca(ifc.ifc_len);
  404. +
  405. +    if (ioctl(sock, SIOCGIFCONF, &ifc) < 0)
  406. +      DEBUG(0, ( "SIOCGIFCONF: %s\n", strerror(errno)));
  407. +    else {
  408. +      ifr = ifc.ifc_req;
  409. +
  410. +      for (i = 0; i < n_interfaces; ++i) {
  411. +    if (if_ipaddr->s_addr ==
  412. +        ((struct sockaddr_in *) &ifr[i].ifr_addr)->sin_addr.s_addr) {
  413. +      found = True;
  414. +      break;
  415. +    }
  416. +      }
  417. +    }
  418. +  }
  419. +#elif defined(USE_IFREQ)
  420. +  ifc = (struct ifconf *)buff;
  421. +  ifc->ifc_len = BUFSIZ - sizeof(struct ifconf);
  422. +  strioctl.ic_cmd = SIOCGIFCONF;
  423. +  strioctl.ic_dp  = (char *)ifc;
  424. +  strioctl.ic_len = sizeof(buff);
  425. +  if (ioctl(sock, I_STR, &strioctl) < 0) {
  426. +    DEBUG(0,( "I_STR/SIOCGIFCONF: %s\n", strerror(errno)));
  427. +  } else {
  428. +    ifr = (struct ifreq *)ifc->ifc_req;  
  429. +
  430. +    /* Loop through interfaces, looking for given IP address */
  431. +    for (i = ifc->ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
  432. +      if (if_ipaddr->s_addr ==
  433. +      (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
  434. +    found = True;
  435. +    break;
  436. +      }
  437. +    }
  438. +  }
  439. +#elif defined(__FreeBSD__) || defined(NETBSD)
  440. +  ifc.ifc_len = sizeof(buff);
  441. +  ifc.ifc_buf = buff;
  442. +  if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {
  443. +    DEBUG(0,("SIOCGIFCONF: %s\n", strerror(errno)));
  444. +  } else {
  445. +    ifr = ifc.ifc_req;
  446. +    /* Loop through interfaces, looking for given IP address */
  447. +    i = ifc.ifc_len;
  448. +    while (i > 0) {
  449. +      if (if_ipaddr->s_addr ==
  450. +      (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
  451. +    found = True;
  452. +    break;
  453. +      }
  454. +      i -= ifr->ifr_addr.sa_len + IFNAMSIZ;
  455. +      ifr = (struct ifreq*) ((char*) ifr + ifr->ifr_addr.sa_len + IFNAMSIZ);
  456. +    }
  457. +  }
  458. +#else
  459. +  ifc.ifc_len = sizeof(buff);
  460. +  ifc.ifc_buf = buff;
  461. +  if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {
  462. +    DEBUG(0,("SIOCGIFCONF: %s\n", strerror(errno)));
  463. +  } else {
  464. +    ifr = ifc.ifc_req;
  465. +  
  466. +    /* Loop through interfaces, looking for given IP address */
  467. +    for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
  468. +#ifdef BSDI
  469. +      if (ioctl(sock, SIOCGIFADDR, ifr) < 0) break;
  470. +#endif
  471. +      if (if_ipaddr->s_addr ==
  472. +      (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
  473. +    found = True;
  474. +    break;
  475. +      }
  476. +    }
  477. +  }
  478. +#endif
  479. +  
  480. +  if (!found) {
  481. +    DEBUG(0,("No interface found for address %s\n", inet_ntoa(*if_ipaddr)));
  482. +  } else {
  483. +    /* Get the netmask address from the kernel */
  484. +#ifdef USE_IFREQ
  485. +    ifreq = *ifr;
  486. +  
  487. +    strioctl.ic_cmd = SIOCGIFNETMASK;
  488. +    strioctl.ic_dp  = (char *)&ifreq;
  489. +    strioctl.ic_len = sizeof(struct ifreq);
  490. +    if (ioctl(sock, I_STR, &strioctl) < 0)
  491. +      DEBUG(0,("Failed I_STR/SIOCGIFNETMASK: %s\n", strerror(errno)));
  492. +    else
  493. +      *if_nmask = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr;
  494. +#else
  495. +    if (ioctl(sock, SIOCGIFNETMASK, ifr) < 0)
  496. +      DEBUG(0,("SIOCGIFNETMASK failed\n"));
  497. +    else
  498. +      *if_nmask = ((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr;
  499. +#endif
  500. +
  501. +    DEBUG(4,("Netmask for %s = %s\n", ifr->ifr_name,
  502. +         inet_ntoa(*if_nmask)));
  503. +  }
  504. +
  505. +  /* Close up shop */
  506. +  (void) close(sock);
  507. +  
  508. +#endif
  509. +
  510. +  /* sanity check on the netmask */
  511. +  {
  512. +    unsigned long nm = ntohl(if_nmask->s_addr);
  513. +    if ((nm >> 24) != 0xFF) {
  514. +      DEBUG(0,("Impossible netmask %s - using defaults\n",inet_ntoa(*if_nmask)));
  515. +      default_netmask(if_nmask, if_ipaddr);      
  516. +    }
  517. +  }
  518. +
  519. +  /* derive the broadcast assuming a 1's broadcast, as this is what
  520. +     all MS operating systems do, we have to comply even if the unix
  521. +     box is setup differently */
  522. +  {
  523. +    unsigned long ad = ntohl(if_ipaddr->s_addr);
  524. +    unsigned long nm = ntohl(if_nmask->s_addr);
  525. +    unsigned long bc = (ad & nm) | (0xffffffff & ~nm);
  526. +    if_bcast->s_addr = htonl(bc);
  527. +  }
  528. +  
  529. +  DEBUG(4,("Derived broadcast address %s\n", inet_ntoa(*if_bcast)));
  530. +}  /* get_broadcast */
  531. +
  532. +
  533. +
  534. +
  535. +/****************************************************************************
  536. +load a list of network interfaces
  537. +****************************************************************************/
  538. +void load_interfaces(void)
  539. +{
  540. +  char *s = lp_interfaces();
  541. +  char *ptr = s;
  542. +  fstring token;
  543. +  struct interface *iface;
  544. +  struct in_addr ip;
  545. +
  546. +  ipzero = *interpret_addr2("0.0.0.0");
  547. +
  548. +  while (next_token(&ptr,token,NULL)) {
  549. +    /* parse it into an IP address/netmasklength pair */
  550. +    char *p = strchr(token,'/');
  551. +    if (p) *p = 0;
  552. +
  553. +    ip = *interpret_addr2(token);
  554. +
  555. +    /* maybe we already have it listed */
  556. +    {
  557. +      struct interface *i;
  558. +      for (i=interfaces;i;i=i->next)
  559. +    if (ip_equal(ip,i->ip)) break;
  560. +      if (i) continue;
  561. +    }
  562. +
  563. +    iface = (struct interface *)malloc(sizeof(*iface));
  564. +    if (!iface) return;
  565. +
  566. +    iface->ip = ip;
  567. +
  568. +    if (p) {
  569. +      if (strlen(p+1)>2)
  570. +    iface->nmask = *interpret_addr2(p+1);
  571. +      else
  572. +    iface->nmask.s_addr = htonl(~((1<<(32-atoi(p+1)))-1));
  573. +    } else {
  574. +      default_netmask(&iface->nmask,&iface->ip);
  575. +    }
  576. +    iface->bcast.s_addr = iface->ip.s_addr | ~iface->nmask.s_addr;
  577. +    iface->next = NULL;
  578. +
  579. +    if (!interfaces) {
  580. +      interfaces = iface;
  581. +    } else {
  582. +      last_iface->next = iface;
  583. +    }
  584. +    last_iface = iface;
  585. +    DEBUG(1,("Added interface ip=%s ",inet_ntoa(iface->ip)));
  586. +    DEBUG(1,("bcast=%s ",inet_ntoa(iface->bcast)));
  587. +    DEBUG(1,("nmask=%s\n",inet_ntoa(iface->nmask)));         
  588. +  }
  589. +
  590. +  if (interfaces) return;
  591. +
  592. +  /* setup a default interface */
  593. +  iface = (struct interface *)malloc(sizeof(*iface));
  594. +  if (!iface) return;
  595. +
  596. +  if (got_ip) {
  597. +    iface->ip = default_ip;
  598. +  } else {
  599. +    get_myname(NULL,&iface->ip);
  600. +  }
  601. +
  602. +  if (got_bcast) {
  603. +    iface->bcast = default_bcast;
  604. +  } else {
  605. +    get_broadcast(&iface->ip,&iface->bcast,&iface->nmask);
  606. +  }
  607. +
  608. +  if (got_nmask) {
  609. +    iface->nmask = default_nmask;
  610. +    iface->bcast.s_addr = iface->ip.s_addr | ~iface->nmask.s_addr;
  611. +  }
  612. +
  613. +  if (iface->bcast.s_addr != (iface->ip.s_addr | ~iface->nmask.s_addr)) {
  614. +    DEBUG(2,("Warning: inconsistant interface %s\n",inet_ntoa(iface->ip)));
  615. +  }
  616. +
  617. +  interfaces = last_iface = iface;
  618. +
  619. +  DEBUG(1,("Added interface ip=%s ",inet_ntoa(iface->ip)));
  620. +  DEBUG(1,("bcast=%s ",inet_ntoa(iface->bcast)));
  621. +  DEBUG(1,("nmask=%s\n",inet_ntoa(iface->nmask)));         
  622. +}
  623. +
  624. +
  625. +/****************************************************************************
  626. +  override the defaults
  627. +  **************************************************************************/
  628. +void iface_set_default(char *ip,char *bcast,char *nmask)
  629. +{
  630. +  if (ip) {
  631. +    got_ip = True;
  632. +    default_ip = *interpret_addr2(ip);
  633. +  }
  634. +
  635. +  if (bcast) {
  636. +    got_bcast = True;
  637. +    default_bcast = *interpret_addr2(bcast);
  638. +  }
  639. +
  640. +  if (nmask) {
  641. +    got_nmask = True;
  642. +    default_nmask = *interpret_addr2(nmask);
  643. +  }
  644. +}
  645. +
  646. +
  647. +/****************************************************************************
  648. +  check if an IP is one of mine
  649. +  **************************************************************************/
  650. +BOOL ismyip(struct in_addr ip)
  651. +{
  652. +  struct interface *i;
  653. +  for (i=interfaces;i;i=i->next)
  654. +    if (ip_equal(i->ip,ip)) return True;
  655. +  return False;
  656. +}
  657. +
  658. +/****************************************************************************
  659. +  check if a bcast is one of mine
  660. +  **************************************************************************/
  661. +BOOL ismybcast(struct in_addr bcast)
  662. +{
  663. +  struct interface *i;
  664. +  for (i=interfaces;i;i=i->next)
  665. +    if (ip_equal(i->bcast,bcast)) return True;
  666. +  return False;
  667. +}
  668. +
  669. +static struct interface *iface_find(struct in_addr ip)
  670. +{
  671. +  struct interface *i;
  672. +  if (zero_ip(ip)) return interfaces;
  673. +
  674. +  for (i=interfaces;i;i=i->next)
  675. +    if (same_net(i->ip,ip,i->nmask)) return i;
  676. +
  677. +  return interfaces;
  678. +}
  679. +
  680. +
  681. +/* these 3 functions return the ip/bcast/nmask for the interface
  682. +   most appropriate for the given ip address */
  683. +
  684. +struct in_addr *iface_bcast(struct in_addr ip)
  685. +{
  686. +  return(&iface_find(ip)->bcast);
  687. +}
  688. +
  689. +struct in_addr *iface_nmask(struct in_addr ip)
  690. +{
  691. +  return(&iface_find(ip)->nmask);
  692. +}
  693. +
  694. +struct in_addr *iface_ip(struct in_addr ip)
  695. +{
  696. +  return(&iface_find(ip)->ip);
  697. +}
  698. +
  699. +
  700. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/ipc.c samba-1.9.16alpha8/source/ipc.c
  701. --- samba-1.9.16alpha7/source/ipc.c    Mon Jun  3 10:41:13 1996
  702. +++ samba-1.9.16alpha8/source/ipc.c    Thu Jun  6 21:57:21 1996
  703. @@ -808,7 +808,8 @@
  704.    number of entries
  705.    ******************************************************************/
  706.  static int get_server_info(uint32 servertype, 
  707. -               struct srv_info_struct **servers, BOOL domains, char *domain)
  708. +               struct srv_info_struct **servers, BOOL domains, 
  709. +               char *domain)
  710.  {
  711.    FILE *f;
  712.    pstring fname;
  713. @@ -831,7 +832,7 @@
  714.    /* request for everything is code for request all servers */
  715.    if (servertype == SV_TYPE_ALL) servertype &= ~SV_TYPE_DOMAIN_ENUM;
  716.  
  717. -  DEBUG(4, ("Servertype search: %8x domains:%s\n", servertype,BOOLSTR(domains)));
  718. +  DEBUG(4,("Servertype search: %8x domains:%s\n",servertype,BOOLSTR(domains)));
  719.  
  720.    while (!feof(f))
  721.    {
  722. @@ -861,10 +862,16 @@
  723.        strcpy(s->domain,my_workgroup()); 
  724.      }
  725.      
  726. -    if (sscanf(stype,"%X",&s->type) != 1) { DEBUG(4,("r:host file ")); ok = False; }
  727. +    if (sscanf(stype,"%X",&s->type) != 1) { 
  728. +      DEBUG(4,("r:host file ")); 
  729. +      ok = False; 
  730. +    }
  731.      
  732.      /* doesn't match up: don't want it */
  733. -    if (!(servertype & s->type)) { DEBUG(4,("r:serv type ")); ok = False; }
  734. +    if (!(servertype & s->type)) { 
  735. +      DEBUG(4,("r:serv type ")); 
  736. +      ok = False; 
  737. +    }
  738.      
  739.      if ((servertype == ~SV_TYPE_DOMAIN_ENUM) &&
  740.      (s->type & SV_TYPE_DOMAIN_ENUM))
  741. @@ -902,6 +909,7 @@
  742.    return(count);
  743.  }
  744.  
  745. +
  746.  /*******************************************************************
  747.    fill in a server info structure
  748.    ******************************************************************/
  749. @@ -981,6 +989,11 @@
  750.  }
  751.  
  752.  
  753. +static BOOL srv_comp(struct srv_info_struct *s1,struct srv_info_struct *s2)
  754. +{
  755. +  return(strcmp(s1->name,s2->name));
  756. +}
  757. +
  758.  /****************************************************************************
  759.    view list of servers available (or possibly domains). The info is
  760.    extracted from lists saved by nmbd on the local host
  761. @@ -1038,23 +1051,30 @@
  762.  
  763.    data_len = fixed_len = string_len = 0;
  764.  
  765. +  qsort(servers,total,sizeof(servers[0]),QSORT_CAST srv_comp);
  766. +
  767.    {
  768. +    char *lastname=NULL;
  769. +
  770.      for (i=0;i<total;i++)
  771.      {
  772.        struct srv_info_struct *s = &servers[i];
  773. -      if (filter_server_info(s,domains,domain,local_request|domain_request))
  774. -      {
  775. -        data_len += fill_srv_info(s,uLevel,0,&f_len,0,&s_len,0);
  776. -          DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
  777. -                s->name, s->type, s->comment, s->domain));
  778. -
  779. -        if (data_len <= buf_len)
  780. +      if (filter_server_info(s,domains,domain,
  781. +                 local_request|domain_request))
  782. +    {
  783. +      if (lastname && strequal(lastname,s->name)) continue;
  784. +      lastname = s->name;
  785. +      data_len += fill_srv_info(s,uLevel,0,&f_len,0,&s_len,0);
  786. +      DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
  787. +           s->name, s->type, s->comment, s->domain));
  788. +      
  789. +      if (data_len <= buf_len)
  790.          {
  791.            counted++;
  792.            fixed_len += f_len;
  793.            string_len += s_len;
  794.          }
  795. -      }
  796. +    }
  797.      }
  798.    }
  799.  
  800. @@ -1068,18 +1088,21 @@
  801.    s_len = string_len;
  802.  
  803.    {
  804. +    char *lastname=NULL;
  805.      int count2 = counted;
  806.      for (i = 0; i < total && count2;i++)
  807. -    {
  808. -      struct srv_info_struct *s = &servers[i];
  809. -      if (filter_server_info(s,domains,domain,local_request|domain_request))
  810.        {
  811. -        fill_srv_info(s,uLevel,&p,&f_len,&p2,&s_len,*rdata);
  812. -          DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
  813. -                s->name, s->type, s->comment, s->domain));
  814. -        count2--;
  815. +    struct srv_info_struct *s = &servers[i];
  816. +    if (filter_server_info(s,domains,domain,local_request|domain_request))
  817. +      {
  818. +        if (lastname && strequal(lastname,s->name)) continue;
  819. +        lastname = s->name;
  820. +        fill_srv_info(s,uLevel,&p,&f_len,&p2,&s_len,*rdata);
  821. +        DEBUG(4,("fill_srv_info %20s %8x %25s %15s\n",
  822. +             s->name, s->type, s->comment, s->domain));
  823. +        count2--;
  824. +      }
  825.        }
  826. -    }
  827.    }
  828.    
  829.    *rparam_len = 8;
  830. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/loadparm.c samba-1.9.16alpha8/source/loadparm.c
  831. --- samba-1.9.16alpha7/source/loadparm.c    Wed Jun  5 01:16:27 1996
  832. +++ samba-1.9.16alpha8/source/loadparm.c    Thu Jun  6 21:57:21 1996
  833. @@ -109,61 +109,62 @@
  834.   */
  835.  typedef struct
  836.  {
  837. -   char *szPrintcapname;
  838. -   char *szLockDir;
  839. -   char *szRootdir;
  840. -   char *szDefaultService;
  841. -   char *szDfree;
  842. -   char *szMsgCommand;
  843. -   char *szHostsEquiv;
  844. -   char *szServerString;
  845. -   char *szAutoServices;
  846. -   char *szPasswdProgram;
  847. -   char *szPasswdChat;
  848. -   char *szLogFile;
  849. -   char *szConfigFile;
  850. -   char *szSMBPasswdFile;
  851. -   char *szPasswordServer;
  852. -   char *szSocketOptions;
  853. -   char *szValidChars;
  854. -   char *szWorkGroup;
  855. -   char *szDomainController;
  856. -   char *szUsernameMap;
  857. -   char *szCharacterSet;
  858. -   char *szLogonScript;
  859. -   char *szSmbrun;
  860. -   char *szWINSserver;
  861. -   int max_log_size;
  862. -   int mangled_stack;
  863. -   int max_xmit;
  864. -   int max_mux;
  865. -   int max_packet;
  866. -   int pwordlevel;
  867. -   int deadtime;
  868. -   int maxprotocol;
  869. -   int security;
  870. -   int printing;
  871. -   int maxdisksize;
  872. -   int lpqcachetime;
  873. -   int syslog;
  874. -   int os_level;
  875. -   int max_ttl;
  876. -   BOOL bWINSsupport;
  877. -   BOOL bWINSproxy;
  878. -   BOOL bPreferredMaster;
  879. -   BOOL bDomainMaster;
  880. -   BOOL bDomainLogons;
  881. -   BOOL bEncryptPasswords;
  882. -   BOOL bStripDot;
  883. -   BOOL bNullPasswords;
  884. -   BOOL bLoadPrinters;
  885. -   BOOL bUseRhosts;
  886. -   BOOL bReadRaw;
  887. -   BOOL bWriteRaw;
  888. -   BOOL bReadPrediction;
  889. -   BOOL bReadbmpx;
  890. -   BOOL bSyslogOnly;
  891. -   BOOL bBrowseList;
  892. +  char *szPrintcapname;
  893. +  char *szLockDir;
  894. +  char *szRootdir;
  895. +  char *szDefaultService;
  896. +  char *szDfree;
  897. +  char *szMsgCommand;
  898. +  char *szHostsEquiv;
  899. +  char *szServerString;
  900. +  char *szAutoServices;
  901. +  char *szPasswdProgram;
  902. +  char *szPasswdChat;
  903. +  char *szLogFile;
  904. +  char *szConfigFile;
  905. +  char *szSMBPasswdFile;
  906. +  char *szPasswordServer;
  907. +  char *szSocketOptions;
  908. +  char *szValidChars;
  909. +  char *szWorkGroup;
  910. +  char *szDomainController;
  911. +  char *szUsernameMap;
  912. +  char *szCharacterSet;
  913. +  char *szLogonScript;
  914. +  char *szSmbrun;
  915. +  char *szWINSserver;
  916. +  char *szInterfaces;
  917. +  int max_log_size;
  918. +  int mangled_stack;
  919. +  int max_xmit;
  920. +  int max_mux;
  921. +  int max_packet;
  922. +  int pwordlevel;
  923. +  int deadtime;
  924. +  int maxprotocol;
  925. +  int security;
  926. +  int printing;
  927. +  int maxdisksize;
  928. +  int lpqcachetime;
  929. +  int syslog;
  930. +  int os_level;
  931. +  int max_ttl;
  932. +  BOOL bWINSsupport;
  933. +  BOOL bWINSproxy;
  934. +  BOOL bPreferredMaster;
  935. +  BOOL bDomainMaster;
  936. +  BOOL bDomainLogons;
  937. +  BOOL bEncryptPasswords;
  938. +  BOOL bStripDot;
  939. +  BOOL bNullPasswords;
  940. +  BOOL bLoadPrinters;
  941. +  BOOL bUseRhosts;
  942. +  BOOL bReadRaw;
  943. +  BOOL bWriteRaw;
  944. +  BOOL bReadPrediction;
  945. +  BOOL bReadbmpx;
  946. +  BOOL bSyslogOnly;
  947. +  BOOL bBrowseList;
  948.  } global;
  949.  
  950.  static global Globals;
  951. @@ -368,6 +369,7 @@
  952.    {"load printers",    P_BOOL,    P_GLOBAL, &Globals.bLoadPrinters,     NULL},
  953.    {"null passwords",   P_BOOL,    P_GLOBAL, &Globals.bNullPasswords,    NULL},
  954.    {"strip dot",        P_BOOL,    P_GLOBAL, &Globals.bStripDot,         NULL},
  955. +  {"interfaces",       P_STRING,  P_GLOBAL, &Globals.szInterfaces,      NULL},
  956.    {"password server",  P_STRING,  P_GLOBAL, &Globals.szPasswordServer,  NULL},
  957.    {"socket options",   P_GSTRING, P_GLOBAL, user_socket_options,        NULL},
  958.    {"smbrun",           P_STRING,  P_GLOBAL, &Globals.szSmbrun,          NULL},
  959. @@ -704,6 +706,7 @@
  960.  FN_GLOBAL_STRING(lp_character_set,&Globals.szCharacterSet) 
  961.  FN_GLOBAL_STRING(lp_logon_script,&Globals.szLogonScript) 
  962.  FN_GLOBAL_STRING(lp_wins_server,&Globals.szWINSserver)
  963. +FN_GLOBAL_STRING(lp_interfaces,&Globals.szInterfaces)
  964.  
  965.  FN_GLOBAL_BOOL(lp_wins_support,&Globals.bWINSsupport)
  966.  FN_GLOBAL_BOOL(lp_wins_proxy,&Globals.bWINSproxy)
  967. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/loadparm.h samba-1.9.16alpha8/source/loadparm.h
  968. --- samba-1.9.16alpha7/source/loadparm.h    Wed Jun  5 01:16:27 1996
  969. +++ samba-1.9.16alpha8/source/loadparm.h    Thu Jun  6 21:57:21 1996
  970. @@ -36,6 +36,7 @@
  971.  extern BOOL lp_loaded(void);
  972.  extern BOOL lp_snum_ok(int iService);
  973.  extern BOOL lp_manglednames(int iService);
  974. +extern char *lp_interfaces(void);
  975.  extern char *lp_passwordserver(void);
  976.  extern char *lp_passwd_program(void);
  977.  extern char *lp_passwd_chat(void);
  978. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/localnet.h samba-1.9.16alpha8/source/localnet.h
  979. --- samba-1.9.16alpha7/source/localnet.h    Tue Jun  4 16:41:12 1996
  980. +++ samba-1.9.16alpha8/source/localnet.h    Thu Jun  6 21:57:21 1996
  981. @@ -1,6 +1,2 @@
  982. -extern struct in_addr myip;
  983. -extern struct in_addr bcast_ip;
  984. -extern struct in_addr Netmask;
  985. -
  986.  extern int ClientNMB;
  987.  extern int ClientDGRAM;
  988. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nameannounce.c samba-1.9.16alpha8/source/nameannounce.c
  989. --- samba-1.9.16alpha7/source/nameannounce.c    Thu Jun  6 01:44:17 1996
  990. +++ samba-1.9.16alpha8/source/nameannounce.c    Thu Jun  6 21:57:21 1996
  991. @@ -33,9 +33,6 @@
  992.  extern int DEBUGLEVEL;
  993.  extern BOOL CanRecurse;
  994.  
  995. -extern struct in_addr myip;
  996. -extern struct in_addr bcast_ip;
  997. -extern struct in_addr Netmask;
  998.  extern struct in_addr ipzero;
  999.  
  1000.  extern pstring myname;
  1001. @@ -84,7 +81,7 @@
  1002.    p = skip_string(p,1);
  1003.    
  1004.    send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,PTR_DIFF(p,outbuf),
  1005. -              myname,work->work_group,0x20,0x0,ip,myip);
  1006. +              myname,work->work_group,0x20,0x1e,ip,*iface_ip(ip));
  1007.  }
  1008.  
  1009.  
  1010. @@ -111,7 +108,7 @@
  1011.    p = skip_string(p,1);
  1012.    
  1013.    send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,PTR_DIFF(p,outbuf),
  1014. -              myname,to_name,from,to,dest_ip,myip);
  1015. +              myname,to_name,from,to,dest_ip,*iface_ip(dest_ip));
  1016.  }
  1017.  
  1018.  /****************************************************************************
  1019. @@ -175,7 +172,8 @@
  1020.                    ClientDGRAM,outbuf,
  1021.                    PTR_DIFF(p,outbuf),
  1022.                    myname, work->work_group,
  1023. -                  0x0,type,d->bcast_ip,myip);
  1024. +                  0x0,type,d->bcast_ip,
  1025. +                  *iface_ip(d->bcast_ip));
  1026.          }
  1027.      }
  1028.      }
  1029. @@ -205,7 +203,7 @@
  1030.      {
  1031.        struct work_record *work;
  1032.        
  1033. -      if (!ip_equal(bcast_ip,d->bcast_ip))
  1034. +      if (!ismybcast(d->bcast_ip))
  1035.      continue;
  1036.  
  1037.        for (work = d->workgrouplist; work; work = work->next)
  1038. @@ -231,7 +229,7 @@
  1039.        
  1040.        work->lastannounce_time = t;
  1041.  
  1042. -      if (!ip_equal(bcast_ip,d->bcast_ip)) {
  1043. +      if (!ismybcast(d->bcast_ip)) {
  1044.          stype &= ~(SV_TYPE_POTENTIAL_BROWSER | SV_TYPE_MASTER_BROWSER |
  1045.                 SV_TYPE_DOMAIN_MASTER | SV_TYPE_BACKUP_BROWSER |
  1046.                 SV_TYPE_DOMAIN_CTRL | SV_TYPE_DOMAIN_MEMBER);
  1047. @@ -266,7 +264,7 @@
  1048.            p = p+31;
  1049.            p = skip_string(p,1);
  1050.            
  1051. -          if (ip_equal(bcast_ip,d->bcast_ip))
  1052. +          if (ismybcast(d->bcast_ip))
  1053.          {
  1054.            if (AM_MASTER(work))
  1055.              {
  1056. @@ -280,7 +278,8 @@
  1057.                send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,
  1058.                        PTR_DIFF(p,outbuf),
  1059.                        my_name,work->work_group,0,
  1060. -                      0x1e,d->bcast_ip,myip);
  1061. +                      0x1e,d->bcast_ip,
  1062. +                      *iface_ip(d->bcast_ip));
  1063.                
  1064.                DEBUG(2,("sending domain announce to %s for %s\n",
  1065.                     inet_ntoa(d->bcast_ip),work->work_group));
  1066. @@ -297,7 +296,8 @@
  1067.                
  1068.                send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,
  1069.                        PTR_DIFF(p,outbuf),
  1070. -                      my_name,MSBROWSE,0,0x01,d->bcast_ip,myip);
  1071. +                      my_name,MSBROWSE,0,0x01,d->bcast_ip,
  1072. +                      *iface_ip(d->bcast_ip));
  1073.              }
  1074.            else
  1075.              {
  1076. @@ -309,7 +309,7 @@
  1077.                send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,
  1078.                        PTR_DIFF(p,outbuf),
  1079.                        my_name,work->work_group,0,0x1d,
  1080. -                      d->bcast_ip,myip);
  1081. +                      d->bcast_ip,*iface_ip(d->bcast_ip));
  1082.              }
  1083.          }
  1084.          }
  1085. @@ -424,11 +424,10 @@
  1086.            
  1087.            ip = *interpret_addr2(lp_domain_controller());
  1088.            
  1089. -          if (zero_ip(ip))
  1090. -        {
  1091. -          ip = bcast_ip;
  1092. -          bcast = True;
  1093. -        }
  1094. +          if (zero_ip(ip)) {
  1095. +        ip = *iface_bcast(d->bcast_ip);
  1096. +        bcast = True;
  1097. +          }
  1098.  
  1099.            DEBUG(2, ("Searching for PDC %s at %s\n",
  1100.              lp_domain_controller(), inet_ntoa(ip)));
  1101. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/namedb.c samba-1.9.16alpha8/source/namedb.c
  1102. --- samba-1.9.16alpha7/source/namedb.c    Thu Jun  6 10:29:27 1996
  1103. +++ samba-1.9.16alpha8/source/namedb.c    Thu Jun  6 21:57:21 1996
  1104. @@ -28,14 +28,15 @@
  1105.  #include "includes.h"
  1106.  #include "smb.h"
  1107.  #include "loadparm.h"
  1108. -#include "localnet.h"
  1109. +
  1110. +extern int ClientNMB;
  1111. +extern int ClientDGRAM;
  1112.  
  1113.  extern int DEBUGLEVEL;
  1114.  
  1115.  extern time_t StartupTime;
  1116.  extern pstring myname;
  1117.  extern pstring scope;
  1118. -extern struct in_addr bcast_ip;
  1119.  
  1120.  /* this is our browse master/backup cache database */
  1121.  struct browse_cache_record *browserlist = NULL;
  1122. @@ -305,7 +306,8 @@
  1123.    that it get created/added anyway. this allows us to force entries in
  1124.    lmhosts file to be added.
  1125.    **************************************************************************/
  1126. -struct work_record *find_workgroupstruct(struct domain_record *d, fstring name, BOOL add)
  1127. +struct work_record *find_workgroupstruct(struct domain_record *d, 
  1128. +                     fstring name, BOOL add)
  1129.  {
  1130.    struct work_record *ret, *work;
  1131.    
  1132. @@ -323,28 +325,31 @@
  1133.        return NULL;
  1134.      }
  1135.    
  1136. -  for (ret = d->workgrouplist; ret; ret = ret->next)
  1137. -    {
  1138. -      if (!strcmp(ret->work_group,name))
  1139. -    {
  1140. -      DEBUG(4, ("found\n"));
  1141. -      return(ret);
  1142. -    }
  1143. +  for (ret = d->workgrouplist; ret; ret = ret->next) {
  1144. +    if (!strcmp(ret->work_group,name)) {
  1145. +      DEBUG(4, ("found\n"));
  1146. +      return(ret);
  1147.      }
  1148. -  
  1149. -  DEBUG(4, ("not found: creating\n"));
  1150. +  }
  1151. +
  1152. +  if (!add) {
  1153. +    DEBUG(4, ("not found\n"));
  1154. +    return NULL;
  1155. +  }
  1156. +
  1157. +  DEBUG(4,("not found: creating\n"));
  1158.    
  1159.    if ((work = make_workgroup(name)))
  1160.      {
  1161.        if (lp_preferred_master() &&
  1162.        strequal(lp_workgroup(), name) &&
  1163. -      ip_equal(d->bcast_ip, bcast_ip))
  1164. +      ismybcast(d->bcast_ip))
  1165.      {
  1166.        DEBUG(3, ("preferred master startup for %s\n", work->work_group));
  1167.        work->needelection = True;
  1168.        work->ElectionCriterion |= (1<<3);
  1169.      }
  1170. -      if (!ip_equal(bcast_ip, d->bcast_ip))
  1171. +      if (!ismybcast(d->bcast_ip))
  1172.      {
  1173.        work->needelection = False;
  1174.      }
  1175. @@ -446,7 +451,8 @@
  1176.    
  1177.    ip = *interpret_addr2("255.255.255.255");
  1178.    
  1179. -  if (zero_ip(source_ip)) source_ip = bcast_ip;
  1180. +  if (zero_ip(source_ip)) 
  1181. +    source_ip = *iface_bcast(source_ip);
  1182.    
  1183.    /* add the domain into our domain database */
  1184.    if ((d = find_domain(source_ip)) ||
  1185. @@ -516,7 +522,8 @@
  1186.    b->ip     = ip;
  1187.    b->type   = type;
  1188.    
  1189. -  if (newentry || ttl < b->sync_time) b->sync_time = ttl;
  1190. +  if (newentry || ttl < b->sync_time) 
  1191. +    b->sync_time = ttl;
  1192.    
  1193.    if (newentry)
  1194.      {
  1195. @@ -576,7 +583,7 @@
  1196.        bzero((char *)s,sizeof(*s));
  1197.      }
  1198.    
  1199. -  if (ip_equal(bcast_ip, d->bcast_ip) &&
  1200. +  if (ismybcast(d->bcast_ip) &&
  1201.        strequal(lp_workgroup(),work->work_group))
  1202.      {
  1203.        servertype |= SV_TYPE_LOCAL_LIST_ONLY;
  1204. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nameelect.c samba-1.9.16alpha8/source/nameelect.c
  1205. --- samba-1.9.16alpha7/source/nameelect.c    Thu Jun  6 01:44:17 1996
  1206. +++ samba-1.9.16alpha8/source/nameelect.c    Thu Jun  6 21:57:21 1996
  1207. @@ -27,7 +27,9 @@
  1208.  
  1209.  #include "includes.h"
  1210.  #include "loadparm.h"
  1211. -#include "localnet.h"
  1212. +
  1213. +extern int ClientNMB;
  1214. +extern int ClientDGRAM;
  1215.  
  1216.  extern int DEBUGLEVEL;
  1217.  extern pstring scope;
  1218. @@ -59,7 +61,7 @@
  1219.    struct domain_record *d;
  1220.  
  1221.    if (!lastrun) lastrun = t;
  1222. -  if (t < lastrun + 2*60) return;
  1223. +  if (t < lastrun + 5*60) return;
  1224.    lastrun = t;
  1225.  
  1226.    dump_workgroups();
  1227. @@ -94,11 +96,13 @@
  1228.  
  1229.    if (!work || !d) return;
  1230.  
  1231. -  DEBUG(2,("Forcing election on %s\n",work->work_group));
  1232. -
  1233.    if (strequal(work->work_group, lp_workgroup()) &&
  1234. -      ip_equal(bcast_ip, d->bcast_ip))
  1235. +      ismybcast(d->bcast_ip))
  1236.      {
  1237. +
  1238. +      DEBUG(2,("Forcing election on %s %s\n",
  1239. +           work->work_group,inet_ntoa(d->bcast_ip)));
  1240. +
  1241.        /* we can attempt to become master browser */
  1242.        work->needelection = True;
  1243.      }
  1244. @@ -116,6 +120,7 @@
  1245.       */
  1246.      }
  1247.  }
  1248. +
  1249.  /****************************************************************************
  1250.    send an election packet
  1251.    **************************************************************************/
  1252. @@ -144,7 +149,7 @@
  1253.    p = skip_string(p,1);
  1254.    
  1255.    send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,PTR_DIFF(p,outbuf),
  1256. -              name,group,0,0x1e,d->bcast_ip,myip);
  1257. +              name,group,0,0x1e,d->bcast_ip,*iface_ip(d->bcast_ip));
  1258.  }
  1259.  
  1260.  
  1261. @@ -188,7 +193,7 @@
  1262.    add_server_entry(d,work,work->work_group,domain_type,0,myname,True);
  1263.    add_server_entry(d,work,myname,work->ServerType,0,ServerComment,True);
  1264.    
  1265. -  if (ip_equal(bcast_ip, d->bcast_ip))
  1266. +  if (ismybcast(d->bcast_ip))
  1267.      {
  1268.        /* ask all servers on our local net to announce to us */
  1269.        announce_request(work, d->bcast_ip);
  1270. @@ -244,7 +249,8 @@
  1271.            if (work->ElectionCount++ >= 4)
  1272.          {
  1273.            /* I won! now what :-) */
  1274. -          DEBUG(2,(">>> Won election on %s <<<\n",work->work_group));
  1275. +          DEBUG(2,(">>> Won election on %s %s <<<\n",
  1276. +               work->work_group,inet_ntoa(d->bcast_ip)));
  1277.            
  1278.            work->RunningElection = False;
  1279.            become_master(d, work);
  1280. @@ -309,7 +315,7 @@
  1281.      {
  1282.        if (listening_name(work, &dgram->dest_name) && 
  1283.        strequal(work->work_group, lp_workgroup()) &&
  1284. -      ip_equal(d->bcast_ip, bcast_ip))
  1285. +      ismybcast(d->bcast_ip))
  1286.      {
  1287.        if (win_election(work, version,criterion,timeup,name))
  1288.          {
  1289. @@ -326,7 +332,8 @@
  1290.            if (work->RunningElection)
  1291.          {
  1292.            work->RunningElection = False;
  1293. -          DEBUG(3,(">>> Lost election on %s <<<\n",work->work_group));
  1294. +          DEBUG(3,(">>> Lost election on %s %s <<<\n",
  1295. +               work->work_group,inet_ntoa(d->bcast_ip)));
  1296.            
  1297.            /* if we are the master then remove our masterly names */
  1298.            if (AM_MASTER(work))
  1299. @@ -345,25 +352,26 @@
  1300.    ***************************************************************************/
  1301.  BOOL check_elections(void)
  1302.  {
  1303. -    struct domain_record *d;
  1304. -    BOOL run_any_election = False;
  1305. +  struct domain_record *d;
  1306. +  BOOL run_any_election = False;
  1307.  
  1308. -    for (d = domainlist; d; d = d->next)
  1309. +  for (d = domainlist; d; d = d->next)
  1310. +    {
  1311. +      struct work_record *work;
  1312. +      for (work = d->workgrouplist; work; work = work->next)
  1313.      {
  1314. -        struct work_record *work;
  1315. -        for (work = d->workgrouplist; work; work = work->next)
  1316. -        {
  1317. -            run_any_election |= work->RunningElection;
  1318. -
  1319. -            if (work->needelection && !work->RunningElection)
  1320. -            {
  1321. -                DEBUG(3,(">>> Starting election on %s <<<\n",work->work_group));
  1322. -                work->ElectionCount = 0;
  1323. -                work->RunningElection = True;
  1324. -                work->needelection = False;
  1325. -            }
  1326. -        }
  1327. +      run_any_election |= work->RunningElection;
  1328. +      
  1329. +      if (work->needelection && !work->RunningElection)
  1330. +        {
  1331. +          DEBUG(3,(">>> Starting election on %s %s <<<\n",
  1332. +               work->work_group,inet_ntoa(d->bcast_ip)));
  1333. +          work->ElectionCount = 0;
  1334. +          work->RunningElection = True;
  1335. +          work->needelection = False;
  1336. +        }
  1337.      }
  1338. -    return run_any_election;
  1339. +    }
  1340. +  return run_any_election;
  1341.  }
  1342.  
  1343. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nameresp.c samba-1.9.16alpha8/source/nameresp.c
  1344. --- samba-1.9.16alpha7/source/nameresp.c    Thu Jun  6 01:44:17 1996
  1345. +++ samba-1.9.16alpha8/source/nameresp.c    Thu Jun  6 21:57:21 1996
  1346. @@ -21,13 +21,14 @@
  1347.  */
  1348.  
  1349.  #include "includes.h"
  1350. -#include "localnet.h"
  1351.  #include "loadparm.h"
  1352.  
  1353. +extern int ClientNMB;
  1354. +extern int ClientDGRAM;
  1355. +
  1356.  /* this is our initiated name query response database */
  1357.  struct name_response_record *nameresponselist = NULL;
  1358.  
  1359. -extern struct in_addr myip;
  1360.  extern int DEBUGLEVEL;
  1361.  
  1362.  static uint16 name_trn_id=0;
  1363. @@ -75,21 +76,11 @@
  1364.        DEBUG(3,("Removing dead name query for %s %s (num_msgs=%d)\n",
  1365.             inet_ntoa(n->to_ip), namestr(&n->name), n->num_msgs));
  1366.  
  1367. -      if (n->cmd_type == CHECK_MASTER && n->num_msgs == 0)
  1368. +      if (n->cmd_type == CHECK_MASTER)
  1369.          {
  1370. -          if (n->num_msgs > 1)
  1371. -        {
  1372. -          /* more than one master browser detected on a subnet.
  1373. -             there is a configuration problem. force an election */
  1374. -          struct domain_record *d;
  1375. -          if ((d = find_domain(n->to_ip)))
  1376. -            {
  1377. -              send_election(d,n->name.name,0,0,myname);
  1378. -            }
  1379. -        }
  1380. -          
  1381.            /* if no response received, the master browser must have gone */
  1382. -          browser_gone(n->name.name, n->to_ip);
  1383. +          if (n->num_msgs == 0)
  1384. +        browser_gone(n->name.name, n->to_ip);
  1385.          }
  1386.        
  1387.        nextn = n->next;
  1388. @@ -230,7 +221,7 @@
  1389.        nmb->additional->ttl = quest_type == NMB_REG ? lp_max_ttl() : 0;
  1390.        nmb->additional->rdlength = 6;
  1391.        nmb->additional->rdata[0] = nb_flags;
  1392. -      putip(&nmb->additional->rdata[2],(char *)&myip);
  1393. +      putip(&nmb->additional->rdata[2],(char *)iface_ip(to_ip));
  1394.      }
  1395.    
  1396.    p.ip = to_ip;
  1397. @@ -434,7 +425,7 @@
  1398.        struct packet_struct *packet = read_packet(ClientNMB, NMB_PACKET);
  1399.        if (packet) {
  1400.  #if 1
  1401. -    if (ip_equal(packet->ip,myip) &&
  1402. +    if (ismyip(packet->ip) &&
  1403.          (packet->port == NMB_PORT || packet->port == DGRAM_PORT)) {
  1404.        DEBUG(5,("discarding own packet from %s:%d\n",
  1405.             inet_ntoa(packet->ip),packet->port));      
  1406. @@ -452,7 +443,7 @@
  1407.        struct packet_struct *packet = read_packet(ClientDGRAM, DGRAM_PACKET);
  1408.        if (packet) {
  1409.  #if 1
  1410. -    if (ip_equal(packet->ip,myip) &&
  1411. +    if (ismyip(packet->ip) &&
  1412.            (packet->port == NMB_PORT || packet->port == DGRAM_PORT)) {
  1413.        DEBUG(5,("discarding own packet from %s:%d\n",
  1414.             inet_ntoa(packet->ip),packet->port));      
  1415. @@ -501,6 +492,7 @@
  1416.        StrnCpy(qname,p,15);
  1417.        type = CVAL(p,15);
  1418.        nb_flags = p[16];
  1419. +      trim_string(qname,NULL," ");
  1420.        
  1421.        p += 18;
  1422.        
  1423. @@ -520,17 +512,14 @@
  1424.        struct in_addr nameip;
  1425.        enum name_source src;
  1426.        
  1427. -      if (ip_equal(ip, myip))
  1428. -        {
  1429. -          nameip = ipzero;
  1430. -          src = SELF;
  1431. -        }
  1432. -      else
  1433. -        {
  1434. -          nameip = ip;
  1435. -          src = STATUS_QUERY;
  1436. -        }
  1437. -      add_netbios_entry(qname,type,nb_flags,2*60*60,src,nameip);
  1438. +      if (ismyip(ip)) {
  1439. +        nameip = ipzero;
  1440. +        src = SELF;
  1441. +      } else {
  1442. +        nameip = ip;
  1443. +        src = STATUS_QUERY;
  1444. +      }
  1445. +      add_netbios_entry(qname,type,nb_flags,2*60*60,src,nameip,True);
  1446.      } 
  1447.  
  1448.        /* we want the server name */
  1449. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nameserv.c samba-1.9.16alpha8/source/nameserv.c
  1450. --- samba-1.9.16alpha7/source/nameserv.c    Thu Jun  6 01:44:17 1996
  1451. +++ samba-1.9.16alpha8/source/nameserv.c    Thu Jun  6 21:57:21 1996
  1452. @@ -27,8 +27,9 @@
  1453.  
  1454.  #include "includes.h"
  1455.  #include "loadparm.h"
  1456. -#include "localnet.h"
  1457.  
  1458. +extern int ClientNMB;
  1459. +extern int ClientDGRAM;
  1460.  
  1461.  enum name_search { FIND_SELF, FIND_GLOBAL };
  1462.  
  1463. @@ -102,29 +103,31 @@
  1464.    FIND_GLOBAL - the name can be anyone. first look on the client's
  1465.                  subnet, then the server's subnet, then all subnets.
  1466.    **************************************************************************/
  1467. -static struct name_record *find_name_search(struct nmb_name *name, enum name_search search,
  1468. +static struct name_record *find_name_search(struct nmb_name *name, 
  1469. +                        enum name_search search,
  1470.                          struct in_addr ip)
  1471.  {
  1472. -    struct name_record *ret;
  1473. -
  1474. -    /* any number of winpopup names can be added. must search by ip as well */
  1475. -    if (name->name_type != 0x3) ip = ipzero;
  1476. -
  1477. -    for (ret = namelist; ret; ret = ret->next)
  1478. +  struct name_record *ret;
  1479. +  
  1480. +  /* any number of winpopup names can be added. must search by ip as 
  1481. +     well */
  1482. +  if (name->name_type != 0x3) ip = ipzero;
  1483. +  
  1484. +  for (ret = namelist; ret; ret = ret->next)
  1485. +    {
  1486. +      if (name_equal(&ret->name,name))
  1487.      {
  1488. -        if (name_equal(&ret->name,name))
  1489. -        {
  1490. -            /* self search: self names only */
  1491. -            if (search == FIND_SELF && ret->source != SELF) continue;
  1492. -
  1493. -            if (zero_ip(ip) || ip_equal(ip, ret->ip))
  1494. -            {
  1495. -                return ret;
  1496. -            }
  1497. -        }
  1498. +      /* self search: self names only */
  1499. +      if (search == FIND_SELF && ret->source != SELF) continue;
  1500. +      
  1501. +      if (zero_ip(ip) || ip_equal(ip, ret->ip))
  1502. +        {
  1503. +          return ret;
  1504. +        }
  1505.      }
  1506. -
  1507. -    return NULL;
  1508. +    }
  1509. +  
  1510. +  return NULL;
  1511.  }
  1512.  
  1513.  
  1514. @@ -133,19 +136,19 @@
  1515.    **************************************************************************/
  1516.  void dump_names(void)
  1517.  {
  1518. -    struct name_record *n;
  1519. -    time_t t = time(NULL);
  1520. -
  1521. -    DEBUG(3,("Dump of local name table:\n"));
  1522. -
  1523. -    for (n = namelist; n; n = n->next)
  1524. -    {
  1525. -        DEBUG(3,("%s %s TTL=%d NBFLAGS=%2x\n",
  1526. -                namestr(&n->name),
  1527. -                inet_ntoa(n->ip),
  1528. -                n->death_time?n->death_time-t:0,
  1529. -                n->nb_flags));
  1530. -    }
  1531. +  struct name_record *n;
  1532. +  time_t t = time(NULL);
  1533. +  
  1534. +  DEBUG(3,("Dump of local name table:\n"));
  1535. +  
  1536. +  for (n = namelist; n; n = n->next)
  1537. +    {
  1538. +      DEBUG(3,("%s %s TTL=%d NBFLAGS=%2x\n",
  1539. +           namestr(&n->name),
  1540. +           inet_ntoa(n->ip),
  1541. +           n->death_time?n->death_time-t:0,
  1542. +           n->nb_flags));
  1543. +    }
  1544.  }
  1545.  
  1546.  
  1547. @@ -155,21 +158,24 @@
  1548.  void remove_netbios_name(char *name,int type, enum name_source source,
  1549.               struct in_addr ip)
  1550.  {
  1551. -    struct nmb_name nn;
  1552. -    struct name_record *n;
  1553. -
  1554. -    make_nmb_name(&nn, name, type, scope);
  1555. -    n = find_name_search(&nn, FIND_GLOBAL, ip);
  1556. -
  1557. -    if (n && n->source == source) remove_name(n);
  1558. +  struct nmb_name nn;
  1559. +  struct name_record *n;
  1560. +  
  1561. +  make_nmb_name(&nn, name, type, scope);
  1562. +  n = find_name_search(&nn, FIND_GLOBAL, ip);
  1563. +  
  1564. +  if (n && n->source == source) remove_name(n);
  1565.  }
  1566.  
  1567.  
  1568.  /****************************************************************************
  1569.    add an entry to the name list
  1570.    ****************************************************************************/
  1571. -struct name_record *add_netbios_entry(char *name, int type, int nb_flags, int ttl,
  1572. -                      enum name_source source, struct in_addr ip)
  1573. +struct name_record *add_netbios_entry(char *name, int type, int nb_flags, 
  1574. +                      int ttl,
  1575. +                      enum name_source source, 
  1576. +                      struct in_addr ip,
  1577. +                      BOOL new_only)
  1578.  {
  1579.    struct name_record *n;
  1580.    struct name_record *n2=NULL;
  1581. @@ -181,9 +187,10 @@
  1582.  
  1583.    make_nmb_name(&n->name,name,type,scope);
  1584.  
  1585. -  if ((n2 = find_name_search(&n->name, FIND_GLOBAL, ip)))
  1586. +  if ((n2 = find_name_search(&n->name, FIND_GLOBAL, new_only?ipzero:ip)))
  1587.    {
  1588.      free(n);
  1589. +    if (new_only || (n2->source==SELF && source!=SELF)) return n2;
  1590.      n = n2;
  1591.    }
  1592.  
  1593. @@ -209,7 +216,7 @@
  1594.    if (lp_wins_support())
  1595.      {
  1596.        /* we are a WINS server. */
  1597. -      remove_netbios_name(name,type,SELF,myip);
  1598. +      remove_netbios_name(name,type,SELF,ipzero);
  1599.      }
  1600.    else
  1601.      {
  1602. @@ -229,7 +236,7 @@
  1603.  void add_name_entry(char *name,int type,int nb_flags)
  1604.  {
  1605.    /* always add our own entries */
  1606. -  add_netbios_entry(name,type,nb_flags,0,SELF,myip);
  1607. +  add_netbios_entry(name,type,nb_flags,0,SELF,ipzero,False);
  1608.  
  1609.    if (!lp_wins_support())
  1610.      {
  1611. @@ -257,13 +264,9 @@
  1612.    add_name_entry(myname,0x00,NB_ACTIVE);
  1613.    add_name_entry(myname,0x1f,NB_ACTIVE);
  1614.    
  1615. -  add_netbios_entry("*",0x0,NB_ACTIVE,0,SELF,ip);
  1616. -  add_netbios_entry("__SAMBA__",0x20,NB_ACTIVE,0,SELF,ip);
  1617. -  add_netbios_entry("__SAMBA__",0x00,NB_ACTIVE,0,SELF,ip);
  1618. -  
  1619. -  if (lp_wins_support()) {
  1620. -    add_netbios_entry(inet_ntoa(myip),0x01,NB_ACTIVE,0,SELF,ip); /* nt as? */
  1621. -  }
  1622. +  add_netbios_entry("*",0x0,NB_ACTIVE,0,SELF,ip,False);
  1623. +  add_netbios_entry("__SAMBA__",0x20,NB_ACTIVE,0,SELF,ip,False);
  1624. +  add_netbios_entry("__SAMBA__",0x00,NB_ACTIVE,0,SELF,ip,False);
  1625.  }
  1626.  
  1627.  /*******************************************************************
  1628. @@ -328,7 +331,7 @@
  1629.        struct in_addr found_ip;
  1630.        putip((char*)&found_ip,&nmb->answers->rdata[2]);
  1631.        
  1632. -      if (ip_equal(found_ip, myip))
  1633. +      if (ismyip(found_ip))
  1634.      {
  1635.        remove_netbios_name(name,type,SELF,found_ip);
  1636.      }
  1637. @@ -412,9 +415,9 @@
  1638.        
  1639.        putip((char*)&found_ip,&nmb->answers->rdata[2]);
  1640.        
  1641. -      if (ip_equal(found_ip, myip)) source = SELF;
  1642. +      if (ismyip(found_ip)) source = SELF;
  1643.        
  1644. -      add_netbios_entry(name,type,nb_flags,ttl,source,found_ip);
  1645. +      add_netbios_entry(name,type,nb_flags,ttl,source,found_ip,True);
  1646.      }
  1647.    else
  1648.      {
  1649. @@ -491,7 +494,7 @@
  1650.    else
  1651.      {
  1652.        /* add the name to our subnet/name database */
  1653. -      n = add_netbios_entry(qname,name_type,nb_flags,ttl,REGISTER,ip);
  1654. +      n = add_netbios_entry(qname,name_type,nb_flags,ttl,REGISTER,ip,False);
  1655.      }
  1656.    
  1657.    if (bcast) return;
  1658. @@ -667,12 +670,14 @@
  1659.        /* no luck with DNS. We could possibly recurse here XXXX */
  1660.        /* if this isn't a bcast then we should send a negative reply XXXX */
  1661.        DEBUG(3,("no recursion\n"));
  1662. -      add_netbios_entry(qname,name_type,NB_ACTIVE,60*60,DNSFAIL,dns_ip);
  1663. +      add_netbios_entry(qname,name_type,NB_ACTIVE,60*60,DNSFAIL,
  1664. +                dns_ip,False);
  1665.        return NULL;
  1666.      }
  1667.        
  1668.        /* add it to our cache of names. give it 2 hours in the cache */
  1669. -      n = add_netbios_entry(qname,name_type,NB_ACTIVE,2*60*60,DNS,dns_ip);
  1670. +      n = add_netbios_entry(qname,name_type,NB_ACTIVE,2*60*60,DNS,
  1671. +                dns_ip,False);
  1672.        
  1673.        /* failed to add it? yikes! */
  1674.        if (!n) return NULL;
  1675. @@ -737,7 +742,7 @@
  1676.    struct name_record *n;
  1677.    enum name_search search = dns_type || name_type == 0x1b ?
  1678.      FIND_GLOBAL : FIND_SELF;
  1679. -  
  1680. +
  1681.    DEBUG(3,("Name query "));
  1682.    
  1683.    if ((n = search_for_name(question,p->ip,p->timestamp, search)))
  1684. @@ -746,7 +751,7 @@
  1685.       a name we own or it is for a Primary Domain Controller name */
  1686.        if (bcast && n->source != SELF && name_type != 0x1b)
  1687.      {
  1688. -      if (!lp_wins_proxy() || same_net(p->ip,n->ip,Netmask)) {
  1689. +      if (!lp_wins_proxy() || same_net(p->ip,n->ip,*iface_nmask(p->ip))) {
  1690.          /* never reply with a negative response to broadcast queries */
  1691.          return;
  1692.        }
  1693. @@ -766,9 +771,8 @@
  1694.    /* if asking for a group name (type 0x1e) return 255.255.255.255 */
  1695.    if (ip_equal(retip, gp_ip) && name_type == 0x1e) retip = gp_ip;
  1696.  
  1697. -  /* if the IP is 0 then substitute my IP - we should see which one is on the 
  1698. -     right interface for the caller to do this right XXX */
  1699. -  if (zero_ip(retip)) retip = myip;
  1700. +  /* if the IP is 0 then substitute my IP */
  1701. +  if (zero_ip(retip)) retip = *iface_ip(p->ip);
  1702.  
  1703.    if (success)
  1704.      {
  1705. @@ -897,7 +901,7 @@
  1706.          fstring serv_name;
  1707.          
  1708.          if (interpret_node_status(nmb->answers->rdata,
  1709. -                      &name,0x1d,serv_name,n->to_ip))
  1710. +                      &name,0x1d,serv_name,p->ip))
  1711.            {
  1712.          if (*serv_name)
  1713.            {
  1714. @@ -950,7 +954,7 @@
  1715.          DEBUG(4, (" OK: %s\n", inet_ntoa(found_ip)));
  1716.          add_netbios_entry(nmb->answers->rr_name.name,
  1717.                    nmb->answers->rr_name.name_type,
  1718. -                  nb_flags,GET_TTL(0),STATUS_QUERY,found_ip);
  1719. +                  nb_flags,GET_TTL(0),STATUS_QUERY,found_ip,False);
  1720.        }
  1721.      else
  1722.        {
  1723. @@ -973,73 +977,72 @@
  1724.    ****************************************************************************/
  1725.  void process_nmb(struct packet_struct *p)
  1726.  {
  1727. -    struct nmb_packet *nmb = &p->packet.nmb;
  1728. +  struct nmb_packet *nmb = &p->packet.nmb;
  1729.  
  1730. -    debug_nmb_packet(p);
  1731. +  debug_nmb_packet(p);
  1732.  
  1733. -    switch (nmb->header.opcode) 
  1734. -    {
  1735. -        case 5:
  1736. -        case 8:
  1737. -        case 9:
  1738. +  switch (nmb->header.opcode) 
  1739. +    {
  1740. +    case 5:
  1741. +    case 8:
  1742. +    case 9:
  1743. +      {
  1744. +    if (nmb->header.qdcount==0 || nmb->header.arcount==0) break;
  1745. +    if (nmb->header.response)
  1746. +      response_name_reg(p);
  1747. +    else
  1748. +      reply_name_reg(p);
  1749. +    break;
  1750. +      }
  1751. +      
  1752. +    case 0:
  1753. +      {
  1754. +    if (nmb->header.response)
  1755. +      {
  1756. +        switch (nmb->question.question_type)
  1757. +          {
  1758. +          case 0x0:
  1759.          {
  1760. -            if (nmb->header.qdcount==0 || nmb->header.arcount==0) break;
  1761. -            if (nmb->header.response)
  1762. -                response_name_reg(p);
  1763. -            else
  1764. -                reply_name_reg(p);
  1765. -            break;
  1766. +          response_netbios_packet(p);
  1767. +          break;
  1768.          }
  1769. -
  1770. -        case 0:
  1771. +          }
  1772. +        return;
  1773. +      }
  1774. +    else if (nmb->header.qdcount>0) 
  1775. +      {
  1776. +        switch (nmb->question.question_type)
  1777. +          {
  1778. +          case NMB_QUERY:
  1779.          {
  1780. -            if (nmb->header.response)
  1781. -            {
  1782. -                switch (nmb->question.question_type)
  1783. -                {
  1784. -                    case 0x0:
  1785. -                    {
  1786. -                        response_netbios_packet(p);
  1787. -                        break;
  1788. -                    }
  1789. -                }
  1790. -                return;
  1791. -            }
  1792. -            else if (nmb->header.qdcount>0) 
  1793. -            {
  1794. -                switch (nmb->question.question_type)
  1795. -                {
  1796. -                    case NMB_QUERY:
  1797. -                    {
  1798. -                        reply_name_query(p);
  1799. -                        break;
  1800. -                    }
  1801. -                    case NMB_STATUS:
  1802. -                    {
  1803. -                        reply_name_status(p);
  1804. -                        break;
  1805. -                    }
  1806. -                }
  1807. -                return;
  1808. -            }
  1809. -            break;
  1810. +          reply_name_query(p);
  1811. +          break;
  1812.          }
  1813. -
  1814. -        case 6:
  1815. +          case NMB_STATUS:
  1816.          {
  1817. -            if (nmb->header.qdcount==0 || nmb->header.arcount==0)
  1818. -            {
  1819. -                DEBUG(2,("netbios release packet rejected\n"));
  1820. -                break;
  1821. -            }
  1822. -
  1823. -            if (nmb->header.response)
  1824. -                response_name_release(p);
  1825. -            else
  1826. -                reply_name_release(p);
  1827. -            break;
  1828. +          reply_name_status(p);
  1829. +          break;
  1830.          }
  1831. -    }
  1832. -
  1833. +          }
  1834. +        return;
  1835. +      }
  1836. +    break;
  1837. +      }
  1838. +      
  1839. +    case 6:
  1840. +      {
  1841. +    if (nmb->header.qdcount==0 || nmb->header.arcount==0)
  1842. +      {
  1843. +        DEBUG(2,("netbios release packet rejected\n"));
  1844. +        break;
  1845. +      }
  1846. +    
  1847. +    if (nmb->header.response)
  1848. +      response_name_release(p);
  1849. +    else
  1850. +      reply_name_release(p);
  1851. +    break;
  1852. +      }
  1853. +    }
  1854.  }
  1855.  
  1856. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/namework.c samba-1.9.16alpha8/source/namework.c
  1857. --- samba-1.9.16alpha7/source/namework.c    Thu Jun  6 01:44:17 1996
  1858. +++ samba-1.9.16alpha8/source/namework.c    Thu Jun  6 21:57:22 1996
  1859. @@ -27,7 +27,9 @@
  1860.  
  1861.  #include "includes.h"
  1862.  #include "loadparm.h"
  1863. -#include "localnet.h"
  1864. +
  1865. +extern int ClientNMB;
  1866. +extern int ClientDGRAM;
  1867.  
  1868.  #define TEST_CODE /* want to debug unknown browse packets */
  1869.  
  1870. @@ -35,15 +37,13 @@
  1871.  extern pstring scope;
  1872.  extern BOOL CanRecurse;
  1873.  
  1874. -extern struct in_addr myip;
  1875. -extern struct in_addr bcast_ip;
  1876. -extern struct in_addr Netmask;
  1877. -
  1878.  extern pstring myname;
  1879.  
  1880.  extern int ClientNMB;
  1881.  extern int ClientDGRAM;
  1882.  
  1883. +extern struct in_addr ipzero;
  1884. +
  1885.  extern int workgroup_count; /* total number of workgroups we know about */
  1886.  
  1887.  /* this is our browse cache database */
  1888. @@ -99,7 +99,7 @@
  1889.         name,inet_ntoa(ip),state));
  1890.  
  1891.    send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,PTR_DIFF(p,outbuf),
  1892. -              myname,name,0x20,0x1d,ip,myip);
  1893. +              myname,name,0x20,0x1d,ip,*iface_ip(ip));
  1894.  }
  1895.  
  1896.  
  1897. @@ -194,7 +194,7 @@
  1898.    static time_t last = 0;
  1899.    time_t t = time(NULL);
  1900.    
  1901. -  if (t-last < 4) return; /* don't do too many of these at once! */
  1902. +  if (t-last < 20) return; /* don't do too many of these at once! */
  1903.    
  1904.    last = t;
  1905.    
  1906. @@ -252,7 +252,7 @@
  1907.        if (!(work = find_workgroupstruct(d, name, False))) return;
  1908.        
  1909.        /* request the server to announce if on our subnet */
  1910. -      if (ip_equal(bcast_ip, d->bcast_ip)) announce_request(work, ip);
  1911. +      if (ismybcast(d->bcast_ip)) announce_request(work, ip);
  1912.        
  1913.        /* domain master type or master browser type */
  1914.        if (type == 0x1b || type == 0x1d)
  1915. @@ -276,7 +276,9 @@
  1916.    
  1917.    if (*lp_workgroup() != '*')
  1918.      {
  1919. -      add_domain_entry(bcast_ip,Netmask,lp_workgroup(), True);
  1920. +      add_domain_entry(*iface_bcast(ipzero),
  1921. +               *iface_nmask(ipzero),
  1922. +               lp_workgroup(), True);
  1923.      }
  1924.  }
  1925.  
  1926. @@ -409,7 +411,7 @@
  1927.      
  1928.    }
  1929.    send_mailslot_reply(BROWSE_MAILSLOT,ClientDGRAM,outbuf,PTR_DIFF(p,outbuf),
  1930. -              myname,theirname,0x20,0,ip,myip);
  1931. +              myname,theirname,0x20,0,ip,*iface_ip(ip));
  1932.  }
  1933.  
  1934.  
  1935. @@ -461,8 +463,7 @@
  1936.  {
  1937.    struct dgram_packet *dgram = &p->packet.dgram;
  1938.    struct in_addr ip = dgram->header.source_ip;
  1939. -  struct domain_record *d = find_domain(ip);
  1940. -  
  1941. +  struct domain_record *d = find_domain(ip); 
  1942.    int update_count = CVAL(buf,0);
  1943.    int ttl = IVAL(buf,1)/1000;
  1944.    char *name = buf+5;
  1945. @@ -473,7 +474,8 @@
  1946.    struct work_record *work;
  1947.    char *work_name;
  1948.    char *serv_name = dgram->source_name.name;
  1949. -  
  1950. +  BOOL add = False;
  1951. +
  1952.    comment[43] = 0;
  1953.    
  1954.    DEBUG(4,("Announce(%d) %s(%x)",command,name,name[15]));
  1955. @@ -505,8 +507,17 @@
  1956.    } else {
  1957.      work_name = dgram->dest_name.name;
  1958.    }
  1959. +
  1960. +  /* we need some way of finding out about new workgroups
  1961. +     that appear to be sending packets to us. The name_type checks make
  1962. +     sure we don't add host names as workgroups */
  1963. +  if (command == ANN_HostAnnouncement &&
  1964. +      (dgram->dest_name.name_type == 0x1d ||
  1965. +       dgram->dest_name.name_type == 0x1e))
  1966. +    add = True;
  1967.    
  1968. -  if (!(work = find_workgroupstruct(d, work_name, False))) return;
  1969. +  if (!(work = find_workgroupstruct(d, work_name,add)))
  1970. +    return;
  1971.    
  1972.    DEBUG(4, ("workgroup %s on %s\n", work->work_group, serv_name));
  1973.    
  1974. @@ -534,7 +545,7 @@
  1975.    struct dgram_packet *dgram = &p->packet.dgram;
  1976.    struct in_addr ip = dgram->header.source_ip;
  1977.    struct domain_record *d = find_domain(ip);
  1978. -  struct domain_record *mydomain = find_domain(bcast_ip);
  1979. +  struct domain_record *mydomain = find_domain(*iface_bcast(ip));
  1980.    char *name = buf;
  1981.    struct work_record *work;
  1982.    name[15] = 0;
  1983. @@ -752,7 +763,7 @@
  1984.    
  1985.    if (!d) return;
  1986.    
  1987. -  if (!ip_equal(bcast_ip, d->bcast_ip)) return;
  1988. +  if (!ismybcast(d->bcast_ip)) return;
  1989.    
  1990.    for (work = d->workgrouplist; work; work = work->next)
  1991.      {
  1992. @@ -842,8 +853,9 @@
  1993.    q += 2;
  1994.    
  1995.    send_mailslot_reply(logname,ClientDGRAM,outbuf,PTR_DIFF(q,outbuf),
  1996. -               myname,&dgram->source_name.name[0],0x20,0,p->ip,myip);  
  1997. - }
  1998. +               myname,&dgram->source_name.name[0],0x20,0,p->ip,
  1999. +              *iface_ip(p->ip));  
  2000. +}
  2001.   
  2002.  
  2003.  /****************************************************************************
  2004. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nmbd.c samba-1.9.16alpha8/source/nmbd.c
  2005. --- samba-1.9.16alpha7/source/nmbd.c    Thu Jun  6 01:44:17 1996
  2006. +++ samba-1.9.16alpha8/source/nmbd.c    Thu Jun  6 21:57:22 1996
  2007. @@ -27,7 +27,6 @@
  2008.  
  2009.  #include "includes.h"
  2010.  #include "loadparm.h"
  2011. -#include "localnet.h"
  2012.  
  2013.  extern int DEBUGLEVEL;
  2014.  
  2015. @@ -49,15 +48,11 @@
  2016.  /* machine comment for host announcements */
  2017.  pstring ServerComment="";
  2018.  
  2019. -static BOOL got_bcast = False;
  2020. -static BOOL got_myip = False;
  2021. -static BOOL got_nmask = False;
  2022. -
  2023.  /* what server type are we currently */
  2024.  
  2025.  time_t StartupTime =0;
  2026.  
  2027. -struct in_addr ipzero;
  2028. +extern struct in_addr ipzero;
  2029.  
  2030.  
  2031.  /****************************************************************************
  2032. @@ -187,6 +182,8 @@
  2033.      reload_services(True);
  2034.    }
  2035.  
  2036. +  load_interfaces();
  2037. +
  2038.    return(ret);
  2039.  }
  2040.  
  2041. @@ -248,7 +245,7 @@
  2042.      if (strchr(mask, 'G') || strchr(mask, 'S') || strchr(mask, 'M')) {
  2043.        strcpy(flags, mask );
  2044.        /* default action for no subnet mask */
  2045. -      strcpy(mask, inet_ntoa(Netmask));
  2046. +      strcpy(mask, "");
  2047.      }
  2048.  
  2049.      DEBUG(4, ("lmhost entry: %s %s %s %s\n", ip, name, mask, flags));
  2050. @@ -262,12 +259,15 @@
  2051.      }
  2052.  
  2053.      ipaddr = *interpret_addr2(ip);
  2054. -    ipmask = *interpret_addr2(mask);
  2055. +    if (*mask)
  2056. +      ipmask = *interpret_addr2(mask);
  2057. +    else 
  2058. +      ipmask = *iface_nmask(ipaddr);
  2059.  
  2060.      if (group) {
  2061.        add_domain_entry(ipaddr, ipmask, name, True);
  2062.      } else {
  2063. -      add_netbios_entry(name,0x20,NB_ACTIVE,0,source,ipaddr);
  2064. +      add_netbios_entry(name,0x20,NB_ACTIVE,0,source,ipaddr,False);
  2065.      }
  2066.        }
  2067.      }
  2068. @@ -347,78 +347,14 @@
  2069.  }
  2070.  
  2071.  
  2072. -/*******************************************************************
  2073. -  check that a IP, bcast and netmask and consistent. Must be a 1s
  2074. -  broadcast
  2075. -  ******************************************************************/
  2076. -static BOOL ip_consistent(struct in_addr ip,struct in_addr bcast, struct in_addr nmask)
  2077. -{
  2078. -  unsigned long a_ip,a_bcast,a_nmask;
  2079. -
  2080. -  a_ip = ntohl(ip.s_addr);
  2081. -  a_bcast = ntohl(bcast.s_addr);
  2082. -  a_nmask = ntohl(nmask.s_addr);
  2083. -
  2084. -  /* check the netmask is sane */
  2085. -  if (((a_nmask>>24)&0xFF) != 0xFF) {
  2086. -    DEBUG(0,("Insane netmask %s\n",inet_ntoa(nmask)));
  2087. -    return(False);
  2088. -  }
  2089. -
  2090. -  /* check the IP and bcast are on the same net */
  2091. -  if ((a_ip&a_nmask) != (a_bcast&a_nmask)) {
  2092. -    DEBUG(0,("IP and broadcast are on different nets!\n"));
  2093. -    return(False);
  2094. -  }
  2095. -
  2096. -  /* check the IP and bcast are on the same net */
  2097. -  if ((a_bcast|a_nmask) != 0xFFFFFFFF) {
  2098. -    DEBUG(0,("Not a ones based broadcast %s\n",inet_ntoa(bcast)));
  2099. -    return(False);
  2100. -  }
  2101. -
  2102. -  return(True);
  2103. -}
  2104. -
  2105. -
  2106.  /****************************************************************************
  2107.    initialise connect, service and file structs
  2108.  ****************************************************************************/
  2109.  static BOOL init_structs()
  2110.  {
  2111. -  if (!get_myname(myhostname,got_myip?NULL:&myip))
  2112. +  if (!get_myname(myhostname,NULL))
  2113.      return(False);
  2114.  
  2115. -  /* Read the broadcast address from the interface */
  2116. -  {
  2117. -    struct in_addr ip0,ip1,ip2;
  2118. -
  2119. -    ip0 = myip;
  2120. -
  2121. -    if (!(got_bcast && got_nmask))
  2122. -      {
  2123. -    get_broadcast(&ip0,&ip1,&ip2);
  2124. -
  2125. -    if (!got_myip)
  2126. -      myip = ip0;
  2127. -    
  2128. -    if (!got_bcast)
  2129. -      bcast_ip = ip1;
  2130. -    
  2131. -    if (!got_nmask)
  2132. -      Netmask = ip2;   
  2133. -      } 
  2134. -
  2135. -    DEBUG(1,("Using IP %s  ",inet_ntoa(myip))); 
  2136. -    DEBUG(1,("broadcast %s  ",inet_ntoa(bcast_ip)));
  2137. -    DEBUG(1,("netmask %s\n",inet_ntoa(Netmask)));    
  2138. -
  2139. -    if (!ip_consistent(myip,bcast_ip,Netmask)) {
  2140. -      DEBUG(0,("WARNING: The IP address, broadcast and Netmask are not consistent\n"));
  2141. -      DEBUG(0,("You are likely to experience problems with this setup!\n"));
  2142. -    }
  2143. -  }
  2144. -
  2145.    if (! *myname) {
  2146.      char *p;
  2147.      strcpy(myname,myhostname);
  2148. @@ -462,7 +398,9 @@
  2149.    int opt;
  2150.    extern FILE *dbf;
  2151.    extern char *optarg;
  2152. +  fstring group;
  2153.  
  2154. +  *group = 0;
  2155.    *host_file = 0;
  2156.  
  2157.    StartupTime = time(NULL);
  2158. @@ -475,8 +413,6 @@
  2159.  
  2160.    charset_initialise();
  2161.  
  2162. -  ipzero = *interpret_addr2("0.0.0.0");
  2163. -
  2164.  #ifdef LMHOSTSFILE
  2165.    strcpy(host_file,LMHOSTSFILE);
  2166.  #endif
  2167. @@ -491,9 +427,6 @@
  2168.  
  2169.    signal(SIGHUP,SIGNAL_CAST sig_hup);
  2170.  
  2171. -  bcast_ip = ipzero;
  2172. -  myip = ipzero;
  2173. -
  2174.    while ((opt = getopt (argc, argv, "s:T:I:C:bAi:B:N:Rn:l:d:Dp:hSH:G:")) != EOF)
  2175.      {
  2176.        switch (opt)
  2177. @@ -505,29 +438,19 @@
  2178.        strcpy(ServerComment,optarg);
  2179.        break;
  2180.      case 'G':
  2181. -      if (got_bcast && got_nmask) {
  2182. -        add_domain_entry(bcast_ip,Netmask,optarg, True);
  2183. -      } else {
  2184. -        DEBUG(0, ("Warning: option -G %s added before broadcast and netmask.\n",
  2185. -              optarg));
  2186. -        DEBUG(0, ("Assuming default values: bcast %s netmask %s\n",
  2187. -              inet_ntoa(bcast_ip), inet_ntoa(Netmask))); /* (i hope) */
  2188. -      }
  2189. +      strcpy(group,optarg);
  2190.        break;
  2191.      case 'H':
  2192.        strcpy(host_file,optarg);
  2193.        break;
  2194.      case 'I':
  2195. -      myip = *interpret_addr2(optarg);
  2196. -      got_myip = True;
  2197. +      iface_set_default(optarg,NULL,NULL);
  2198.        break;
  2199.      case 'B':
  2200. -      bcast_ip = *interpret_addr2(optarg);
  2201. -      got_bcast = True;
  2202. +      iface_set_default(NULL,optarg,NULL);
  2203.        break;
  2204.      case 'N':
  2205. -      Netmask = *interpret_addr2(optarg);
  2206. -      got_nmask = True;
  2207. +      iface_set_default(NULL,NULL,optarg);
  2208.        break;
  2209.      case 'n':
  2210.        strcpy(myname,optarg);
  2211. @@ -567,6 +490,9 @@
  2212.  
  2213.    if (!reload_services(False))
  2214.      return(-1);    
  2215. +
  2216. +  if (*group)
  2217. +    add_domain_entry(*iface_bcast(ipzero),*iface_nmask(ipzero),group, True);
  2218.  
  2219.    if (!is_daemon && !is_a_socket(0)) {
  2220.      DEBUG(0,("standard input is not a socket, assuming -D option\n"));
  2221. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nmblib.c samba-1.9.16alpha8/source/nmblib.c
  2222. --- samba-1.9.16alpha7/source/nmblib.c    Thu Jun  6 01:44:17 1996
  2223. +++ samba-1.9.16alpha8/source/nmblib.c    Thu Jun  6 21:57:22 1996
  2224. @@ -21,10 +21,8 @@
  2225.  */
  2226.  
  2227.  #include "includes.h"
  2228. -#include "localnet.h"
  2229.  #include "loadparm.h"
  2230.  
  2231. -extern struct in_addr myip;
  2232.  extern int DEBUGLEVEL;
  2233.  
  2234.  int num_good_sends = 0;
  2235. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nmblookup.c samba-1.9.16alpha8/source/nmblookup.c
  2236. --- samba-1.9.16alpha7/source/nmblookup.c    Wed Jun  5 01:16:27 1996
  2237. +++ samba-1.9.16alpha8/source/nmblookup.c    Thu Jun  6 21:57:23 1996
  2238. @@ -30,11 +30,8 @@
  2239.  
  2240.  extern pstring scope;
  2241.  
  2242. -extern struct in_addr bcast_ip;
  2243.  extern pstring myhostname;
  2244. -
  2245. -static BOOL got_bcast = False;
  2246. -struct in_addr ipzero;
  2247. +extern struct in_addr ipzero;
  2248.  
  2249.  int ServerFD= -1;
  2250.  
  2251. @@ -69,24 +66,9 @@
  2252.  ****************************************************************************/
  2253.  static BOOL init_structs(void )
  2254.  {
  2255. -  struct in_addr myip;
  2256. -
  2257. -  if (!get_myname(myhostname,&myip))
  2258. +  if (!get_myname(myhostname,NULL))
  2259.      return(False);
  2260.  
  2261. -  /* Read the broadcast address from the interface */
  2262. -  {
  2263. -    struct in_addr ip0,ip2;
  2264. -
  2265. -    ip0 = myip;
  2266. -
  2267. -    if (!got_bcast) {
  2268. -      get_broadcast(&ip0,&bcast_ip,&ip2);
  2269. -
  2270. -      DEBUG(2,("Using broadcast %s\n",inet_ntoa(bcast_ip)));
  2271. -    }
  2272. -  }
  2273. -
  2274.    return True;
  2275.  }
  2276.  
  2277. @@ -124,8 +106,6 @@
  2278.  
  2279.    TimeInit();
  2280.  
  2281. -  ipzero = *interpret_addr2("0.0.0.0");
  2282. -
  2283.    setup_logging(argv[0],True);
  2284.  
  2285.    charset_initialise();
  2286. @@ -134,11 +114,7 @@
  2287.      switch (opt)
  2288.        {
  2289.        case 'B':
  2290. -    {
  2291. -      unsigned long a = interpret_addr(optarg);
  2292. -      putip((char *)&bcast_ip,(char *)&a);
  2293. -      got_bcast = True;
  2294. -    }
  2295. +    iface_set_default(NULL,optarg,NULL);
  2296.      break;
  2297.        case 'i':
  2298.      strcpy(scope,optarg);
  2299. @@ -167,10 +143,11 @@
  2300.      exit(1);
  2301.    }
  2302.  
  2303. +  load_interfaces();
  2304.    init_structs();
  2305.    if (!open_sockets()) return(1);
  2306.  
  2307. -  DEBUG(1,("Sending queries to %s\n",inet_ntoa(bcast_ip)));
  2308. +  DEBUG(1,("Sending queries to %s\n",inet_ntoa(*iface_bcast(ipzero))));
  2309.  
  2310.  
  2311.    for (i=optind;i<argc;i++)
  2312. @@ -201,7 +178,7 @@
  2313.        }
  2314.  
  2315.        if (name_query(ServerFD,lookup,lookup_type,bcast,True,
  2316. -             bcast_ip,&ip,NULL)) 
  2317. +             *iface_bcast(ipzero),&ip,NULL)) 
  2318.      {
  2319.        printf("%s %s\n",inet_ntoa(ip),lookup);
  2320.        if (find_status) 
  2321. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/nmbsync.c samba-1.9.16alpha8/source/nmbsync.c
  2322. --- samba-1.9.16alpha7/source/nmbsync.c    Thu Jun  6 01:44:17 1996
  2323. +++ samba-1.9.16alpha8/source/nmbsync.c    Thu Jun  6 21:57:23 1996
  2324. @@ -22,14 +22,13 @@
  2325.  
  2326.  #include "includes.h"
  2327.  #include "loadparm.h"
  2328. -#include "localnet.h"
  2329.  
  2330. +extern int ClientNMB;
  2331. +extern int ClientDGRAM;
  2332.  
  2333.  extern int DEBUGLEVEL;
  2334.  
  2335.  extern pstring myname;
  2336. -extern struct in_addr bcast_ip;
  2337. -extern struct in_addr Netmask;
  2338.  
  2339.  extern int name_type;
  2340.  extern int max_protocol;
  2341. @@ -114,7 +113,7 @@
  2342.            /* creates workgroup on remote subnet */
  2343.            if ((w = find_workgroupstruct(d,sname, False)))
  2344.              {
  2345. -              if (ip_equal(bcast_ip, d->bcast_ip))
  2346. +              if (ismybcast(d->bcast_ip))
  2347.              {
  2348.                announce_request(w, d->bcast_ip);
  2349.              }
  2350. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/password.c samba-1.9.16alpha8/source/password.c
  2351. --- samba-1.9.16alpha7/source/password.c    Wed Jun  5 01:16:28 1996
  2352. +++ samba-1.9.16alpha8/source/password.c    Thu Jun  6 21:57:23 1996
  2353. @@ -43,7 +43,6 @@
  2354.  ********************************************************************/
  2355.  void generate_next_challenge(char *challenge)
  2356.  {
  2357. -  extern void E1(char *,char *,char *);
  2358.    static int counter = 0;
  2359.    struct timeval tval;
  2360.    int v1,v2;
  2361. @@ -1257,7 +1256,6 @@
  2362.    int len;
  2363.    fstring desthost;
  2364.    struct in_addr dest_ip;
  2365. -  extern struct in_addr myip;
  2366.    int port = SMB_PORT;
  2367.    BOOL ret;
  2368.  
  2369. @@ -1285,7 +1283,7 @@
  2370.        continue;
  2371.      }
  2372.  
  2373. -    if (memcmp(&dest_ip,&myip,sizeof(dest_ip)) == 0) {
  2374. +    if (ismyip(dest_ip)) {
  2375.        DEBUG(1,("Password server loop - disabling password server %s\n",p));
  2376.        continue;
  2377.      }
  2378. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/proto.h samba-1.9.16alpha8/source/proto.h
  2379. --- samba-1.9.16alpha7/source/proto.h    Thu Jun  6 10:29:27 1996
  2380. +++ samba-1.9.16alpha8/source/proto.h    Thu Jun  6 21:57:24 1996
  2381. @@ -63,6 +63,13 @@
  2382.  void DirCacheFlush(int snum);
  2383.  void fault_setup(void (*fn)());
  2384.  char *getsmbpass(char *prompt)    ;
  2385. +void load_interfaces(void);
  2386. +void iface_set_default(char *ip,char *bcast,char *nmask);
  2387. +BOOL ismyip(struct in_addr ip);
  2388. +BOOL ismybcast(struct in_addr bcast);
  2389. +struct in_addr *iface_bcast(struct in_addr ip);
  2390. +struct in_addr *iface_nmask(struct in_addr ip);
  2391. +struct in_addr *iface_ip(struct in_addr ip);
  2392.  int reply_trans(char *inbuf,char *outbuf);
  2393.  int interpret_coding_system(char *str, int def);
  2394.  char *lp_string(char *s);
  2395. @@ -109,7 +116,8 @@
  2396.  struct work_record *remove_workgroup(struct domain_record *d, 
  2397.                       struct work_record *work);
  2398.  void expire_browse_cache(time_t t);
  2399. -struct work_record *find_workgroupstruct(struct domain_record *d, fstring name, BOOL add);
  2400. +struct work_record *find_workgroupstruct(struct domain_record *d, 
  2401. +                     fstring name, BOOL add);
  2402.  struct domain_record *find_domain(struct in_addr source_ip);
  2403.  void dump_workgroups(void);
  2404.  struct domain_record *add_domain_entry(struct in_addr source_ip, 
  2405. @@ -164,8 +172,11 @@
  2406.  void dump_names(void);
  2407.  void remove_netbios_name(char *name,int type, enum name_source source,
  2408.               struct in_addr ip);
  2409. -struct name_record *add_netbios_entry(char *name, int type, int nb_flags, int ttl,
  2410. -                      enum name_source source, struct in_addr ip);
  2411. +struct name_record *add_netbios_entry(char *name, int type, int nb_flags, 
  2412. +                      int ttl,
  2413. +                      enum name_source source, 
  2414. +                      struct in_addr ip,
  2415. +                      BOOL new_only);
  2416.  void remove_name_entry(char *name,int type);
  2417.  void add_name_entry(char *name,int type,int nb_flags);
  2418.  void add_my_names(void);
  2419. @@ -466,9 +477,6 @@
  2420.  BOOL do_match(char *str, char *regexp, int case_sig);
  2421.  BOOL mask_match(char *str, char *regexp, int case_sig,BOOL trans2);
  2422.  void become_daemon(void);
  2423. -void get_broadcast(struct in_addr *if_ipaddr,
  2424. -                    struct in_addr *if_bcast,
  2425. -                    struct in_addr *if_nmask);
  2426.  BOOL yesno(char *p);
  2427.  char *fgets_slash(char *s2,int maxlen,FILE *f);
  2428.  int set_filelen(int fd, long len);
  2429. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/server.c samba-1.9.16alpha8/source/server.c
  2430. --- samba-1.9.16alpha7/source/server.c    Thu Jun  6 01:44:18 1996
  2431. +++ samba-1.9.16alpha8/source/server.c    Thu Jun  6 21:57:24 1996
  2432. @@ -79,8 +79,6 @@
  2433.  extern int extra_time_offset;
  2434.  
  2435.  extern pstring myhostname;
  2436. -extern struct in_addr myip;
  2437. -
  2438.  
  2439.  static int find_free_connection(int hash);
  2440.  
  2441. @@ -1778,6 +1776,8 @@
  2442.  
  2443.    reopen_logs();
  2444.  
  2445. +  load_interfaces();
  2446. +
  2447.    {
  2448.      extern int Client;
  2449.      if (Client != -1) {      
  2450. @@ -3550,7 +3550,7 @@
  2451.  static void init_structs(void )
  2452.  {
  2453.    int i;
  2454. -  get_myname(myhostname,&myip);
  2455. +  get_myname(myhostname,NULL);
  2456.  
  2457.    for (i=0;i<MAX_CONNECTIONS;i++)
  2458.      {
  2459. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/time.c samba-1.9.16alpha8/source/time.c
  2460. --- samba-1.9.16alpha7/source/time.c    Sat Jun  1 01:13:08 1996
  2461. +++ samba-1.9.16alpha8/source/time.c    Thu Jun  6 21:57:24 1996
  2462. @@ -142,6 +142,10 @@
  2463.        if (t < low)
  2464.      low = TIME_T_MIN;
  2465.        
  2466. +      high = t + MAX_DST_WIDTH/2;
  2467. +      if (high < t)
  2468. +    high = TIME_T_MAX;
  2469. +      
  2470.        /* widen the new entry using two bisection searches */
  2471.        while (low+60*60 < dst_table[i].start) {
  2472.      if (dst_table[i].start - low > MAX_DST_SKIP*2)
  2473. @@ -154,10 +158,6 @@
  2474.        low = t;
  2475.        }
  2476.  
  2477. -      high = low + MAX_DST_WIDTH/2;
  2478. -      if (high < t)
  2479. -    high = TIME_T_MAX;
  2480. -      
  2481.        while (high-60*60 > dst_table[i].end) {
  2482.      if (high - dst_table[i].end > MAX_DST_SKIP*2)
  2483.        t = dst_table[i].end + MAX_DST_SKIP;
  2484. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/util.c samba-1.9.16alpha8/source/util.c
  2485. --- samba-1.9.16alpha7/source/util.c    Thu Jun  6 01:44:18 1996
  2486. +++ samba-1.9.16alpha8/source/util.c    Thu Jun  6 21:57:24 1996
  2487. @@ -49,11 +49,6 @@
  2488.  /* the last port received from */
  2489.  int lastport=0;
  2490.  
  2491. -/* my IP, the broadcast IP and the Netmask */
  2492. -struct in_addr myip;
  2493. -struct in_addr bcast_ip;
  2494. -struct in_addr Netmask;
  2495. -
  2496.  int trans_num = 0;
  2497.  
  2498.  /*
  2499. @@ -2801,216 +2796,6 @@
  2500.  #endif
  2501.  }
  2502.  
  2503. -/****************************************************************************
  2504. -calculate the default netmask for an address
  2505. -****************************************************************************/
  2506. -static void default_netmask(struct in_addr *inm, struct in_addr *iad)
  2507. -{
  2508. -  unsigned long ad = ntohl(iad->s_addr);
  2509. -  unsigned long nm;
  2510. -  /*
  2511. -  ** Guess a netmask based on the class of the IP address given.
  2512. -  */
  2513. -  if ( (ad & 0x80000000) == 0 ) {
  2514. -    /* class A address */
  2515. -    nm = 0xFF000000;
  2516. -  } else if ( (ad & 0xC0000000) == 0x80000000 ) {
  2517. -    /* class B address */
  2518. -    nm = 0xFFFF0000;
  2519. -  } else if ( (ad & 0xE0000000) == 0xC0000000 ) {
  2520. -    /* class C address */
  2521. -    nm = 0xFFFFFF00;
  2522. -  }  else {
  2523. -    /* class D or E; netmask doesn't make much sense - guess 4 bits */
  2524. -    nm =  0xFFFFFFF0;
  2525. -  }
  2526. -  inm->s_addr = htonl(nm);
  2527. -}
  2528. -
  2529. -/****************************************************************************
  2530. -  get the broadcast address for our address 
  2531. -(troyer@saifr00.ateng.az.honeywell.com)
  2532. -****************************************************************************/
  2533. -void get_broadcast(struct in_addr *if_ipaddr,
  2534. -                    struct in_addr *if_bcast,
  2535. -                    struct in_addr *if_nmask)
  2536. -{  
  2537. -  BOOL found = False;
  2538. -#ifndef NO_GET_BROADCAST
  2539. -  int sock = -1;               /* AF_INET raw socket desc */
  2540. -  char buff[1024];
  2541. -  struct ifreq *ifr=NULL;
  2542. -  int i;
  2543. -
  2544. -#if defined(EVEREST)
  2545. -  int n_interfaces;
  2546. -  struct ifconf ifc;
  2547. -  struct ifreq  *ifreqs;
  2548. -#elif defined(USE_IFREQ)
  2549. -  struct ifreq ifreq;
  2550. -  struct strioctl strioctl;
  2551. -  struct ifconf *ifc;
  2552. -#else
  2553. -  struct ifconf ifc;
  2554. -#endif
  2555. -#endif
  2556. -
  2557. -  /* get a default netmask and broadcast */
  2558. -  default_netmask(if_nmask, if_ipaddr);
  2559. -
  2560. -#ifndef NO_GET_BROADCAST  
  2561. -  /* Create a socket to the INET kernel. */
  2562. -#if USE_SOCKRAW
  2563. -  if ((sock = socket(AF_INET, SOCK_RAW, PF_INET )) < 0)
  2564. -#else
  2565. -    if ((sock = socket(AF_INET, SOCK_DGRAM, 0 )) < 0)
  2566. -#endif
  2567. -      {
  2568. -        DEBUG(0,( "Unable to open socket to get broadcast address\n"));
  2569. -        return;
  2570. -      }
  2571. -  
  2572. -  /* Get a list of the configured interfaces */
  2573. -#ifdef EVEREST
  2574. -  /* This is part of SCO Openserver 5: The ioctls are no longer part
  2575. -     if the lower level STREAMS interface glue. They are now real
  2576. -     ioctl calls */
  2577. -
  2578. -  if (ioctl(sock, SIOCGIFANUM, &n_interfaces) < 0) {
  2579. -    DEBUG(0,( "SIOCGIFANUM: %s\n", strerror(errno)));
  2580. -  } else {
  2581. -    DEBUG(0,( "number of interfaces returned is: %d\n", n_interfaces));
  2582. -
  2583. -    ifc.ifc_len = sizeof(struct ifreq) * n_interfaces;
  2584. -    ifc.ifc_buf = (caddr_t) alloca(ifc.ifc_len);
  2585. -
  2586. -    if (ioctl(sock, SIOCGIFCONF, &ifc) < 0)
  2587. -      DEBUG(0, ( "SIOCGIFCONF: %s\n", strerror(errno)));
  2588. -    else {
  2589. -      ifr = ifc.ifc_req;
  2590. -
  2591. -      for (i = 0; i < n_interfaces; ++i) {
  2592. -    if (if_ipaddr->s_addr ==
  2593. -        ((struct sockaddr_in *) &ifr[i].ifr_addr)->sin_addr.s_addr) {
  2594. -      found = True;
  2595. -      break;
  2596. -    }
  2597. -      }
  2598. -    }
  2599. -  }
  2600. -#elif defined(USE_IFREQ)
  2601. -  ifc = (struct ifconf *)buff;
  2602. -  ifc->ifc_len = BUFSIZ - sizeof(struct ifconf);
  2603. -  strioctl.ic_cmd = SIOCGIFCONF;
  2604. -  strioctl.ic_dp  = (char *)ifc;
  2605. -  strioctl.ic_len = sizeof(buff);
  2606. -  if (ioctl(sock, I_STR, &strioctl) < 0) {
  2607. -    DEBUG(0,( "I_STR/SIOCGIFCONF: %s\n", strerror(errno)));
  2608. -  } else {
  2609. -    ifr = (struct ifreq *)ifc->ifc_req;  
  2610. -
  2611. -    /* Loop through interfaces, looking for given IP address */
  2612. -    for (i = ifc->ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
  2613. -      if (if_ipaddr->s_addr ==
  2614. -      (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
  2615. -    found = True;
  2616. -    break;
  2617. -      }
  2618. -    }
  2619. -  }
  2620. -#elif defined(__FreeBSD__) || defined(NETBSD)
  2621. -  ifc.ifc_len = sizeof(buff);
  2622. -  ifc.ifc_buf = buff;
  2623. -  if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {
  2624. -    DEBUG(0,("SIOCGIFCONF: %s\n", strerror(errno)));
  2625. -  } else {
  2626. -    ifr = ifc.ifc_req;
  2627. -    /* Loop through interfaces, looking for given IP address */
  2628. -    i = ifc.ifc_len;
  2629. -    while (i > 0) {
  2630. -      if (if_ipaddr->s_addr ==
  2631. -      (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
  2632. -    found = True;
  2633. -    break;
  2634. -      }
  2635. -      i -= ifr->ifr_addr.sa_len + IFNAMSIZ;
  2636. -      ifr = (struct ifreq*) ((char*) ifr + ifr->ifr_addr.sa_len + IFNAMSIZ);
  2637. -    }
  2638. -  }
  2639. -#else
  2640. -  ifc.ifc_len = sizeof(buff);
  2641. -  ifc.ifc_buf = buff;
  2642. -  if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {
  2643. -    DEBUG(0,("SIOCGIFCONF: %s\n", strerror(errno)));
  2644. -  } else {
  2645. -    ifr = ifc.ifc_req;
  2646. -  
  2647. -    /* Loop through interfaces, looking for given IP address */
  2648. -    for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
  2649. -#ifdef BSDI
  2650. -      if (ioctl(sock, SIOCGIFADDR, ifr) < 0) break;
  2651. -#endif
  2652. -      if (if_ipaddr->s_addr ==
  2653. -      (*(struct sockaddr_in *) &ifr->ifr_addr).sin_addr.s_addr) {
  2654. -    found = True;
  2655. -    break;
  2656. -      }
  2657. -    }
  2658. -  }
  2659. -#endif
  2660. -  
  2661. -  if (!found) {
  2662. -    DEBUG(0,("No interface found for address %s\n", inet_ntoa(*if_ipaddr)));
  2663. -  } else {
  2664. -    /* Get the netmask address from the kernel */
  2665. -#ifdef USE_IFREQ
  2666. -    ifreq = *ifr;
  2667. -  
  2668. -    strioctl.ic_cmd = SIOCGIFNETMASK;
  2669. -    strioctl.ic_dp  = (char *)&ifreq;
  2670. -    strioctl.ic_len = sizeof(struct ifreq);
  2671. -    if (ioctl(sock, I_STR, &strioctl) < 0)
  2672. -      DEBUG(0,("Failed I_STR/SIOCGIFNETMASK: %s\n", strerror(errno)));
  2673. -    else
  2674. -      *if_nmask = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr;
  2675. -#else
  2676. -    if (ioctl(sock, SIOCGIFNETMASK, ifr) < 0)
  2677. -      DEBUG(0,("SIOCGIFNETMASK failed\n"));
  2678. -    else
  2679. -      *if_nmask = ((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr;
  2680. -#endif
  2681. -
  2682. -    DEBUG(2,("Netmask for %s = %s\n", ifr->ifr_name,
  2683. -         inet_ntoa(*if_nmask)));
  2684. -  }
  2685. -
  2686. -  /* Close up shop */
  2687. -  (void) close(sock);
  2688. -  
  2689. -#endif
  2690. -
  2691. -  /* sanity check on the netmask */
  2692. -  {
  2693. -    unsigned long nm = ntohl(if_nmask->s_addr);
  2694. -    if ((nm >> 24) != 0xFF) {
  2695. -      DEBUG(0,("Impossible netmask %s - using defaults\n",inet_ntoa(*if_nmask)));
  2696. -      default_netmask(if_nmask, if_ipaddr);      
  2697. -    }
  2698. -  }
  2699. -
  2700. -  /* derive the broadcast assuming a 1's broadcast, as this is what
  2701. -     all MS operating systems do, we have to comply even if the unix
  2702. -     box is setup differently */
  2703. -  {
  2704. -    unsigned long ad = ntohl(if_ipaddr->s_addr);
  2705. -    unsigned long nm = ntohl(if_nmask->s_addr);
  2706. -    unsigned long bc = (ad & nm) | (0xffffffff & ~nm);
  2707. -    if_bcast->s_addr = htonl(bc);
  2708. -  }
  2709. -  
  2710. -  DEBUG(2,("Derived broadcast address %s\n", inet_ntoa(*if_bcast)));
  2711. -}  /* get_broadcast */
  2712. -
  2713.  
  2714.  /****************************************************************************
  2715.  put up a yes/no prompt
  2716. @@ -3511,7 +3296,7 @@
  2717.  {
  2718.    static struct in_addr ret;
  2719.    unsigned long a = interpret_addr(str);
  2720. -  putip((char *)&ret,(char *)&a);
  2721. +  ret.s_addr = a;
  2722.    return(&ret);
  2723.  }
  2724.  
  2725. @@ -3731,7 +3516,7 @@
  2726.  ********************************************************************/
  2727.  void ajt_panic(void)
  2728.  {
  2729. -  system("/usr/bin/X11/xedit -display :0 /tmp/ERROR_FAULT &");
  2730. +  system("/usr/bin/X11/xedit -display :0 /tmp/ERROR_FAULT");
  2731.  }
  2732.  #endif
  2733.  
  2734. diff -u -r --new-file --exclude=CVS samba-1.9.16alpha7/source/version.h samba-1.9.16alpha8/source/version.h
  2735. --- samba-1.9.16alpha7/source/version.h    Thu Jun  6 10:29:53 1996
  2736. +++ samba-1.9.16alpha8/source/version.h    Thu Jun  6 21:57:49 1996
  2737. @@ -1 +1 @@
  2738. -#define VERSION "1.9.16alpha7"
  2739. +#define VERSION "1.9.16alpha8"
  2740.